MongoDB中的多表关联查询($lookup)

当一个前端菜鸡需要做一个全栈的毕设项目,真的是太不容易了,特别是我这种数据库还特别渣的人。

新接触的mongodb,很多语法也还没了解透彻,对于所谓的集合嵌套或者集合引用真的是一窍不通,但是最后还是得实现啊,感谢这位大神的分享,这位大哥的详解真的是十分到位,我终于搞懂了https://www.cnblogs.com/xuliuzai/p/10055535.html

我的实现过程

前期需求:

用户集合、粉丝集合。为了将用户集合和粉丝集合相关联,然后获取到每个用户对应的粉丝和所关注的人

代码实现:

node后端代码

在models文件夹下新建用户模型(user.js)和粉丝模型(fans.js)

//user.js文件 (用户模型)
//引入mongoose模块
const mongoose = require('mongoose')
const Schema = mongoose.Schema
//定义数据模型,可以看到,我们下面创建了一个表,表中的数据有字段,并且这些字段的数据类型也定义了,最后将model导出即可
const userSchema = new Schema({
    username : String, 
    password : String, 
    avatar : String, 
    sex : String, 
    number : String, 
    email : String, 
    birth : String, 
    type : String, 
}, { collection: 'user'})
//这里mongoose.Schema最好要写上第二个参数,明确指定到数据库中的哪个表取数据,我这里写了myhreo,目的就是为了以后操作数据要去myhreo表中。
//这里不写第二个参数的话,后面你会遇到坑。
//导出model模块
const User = module.exports = mongoose.model('user',userSchema);
// fans.js (粉丝模型)
//引入mongoose模块
const mongoose = require('mongoose')
const Schema = mongoose.Schema
//定义粉丝模型
const fansSchema = new Schema({
    parent_name : String, 
    fans_name : String, 
}, { collection: 'fans'})
const Fans = module.exports = mongoose.model('fans',fansSchema);

然后在需要的路由下(在router文件夹下建立一个userrouter.js)引用以上模型,写好后端的接口

//引入express模块
const express = require("express");
//定义路由级中间件
const router = express.Router();
//引入数据模型模块
const User = require("../models/user");
const Fans = require("../models/fans");

//添加用户
router.post('/addUser', function (req, res) {
    User.findOne({ 
        username: req.body.username  //用户名不重复
    }, function (err, data) {
            if (data) {
                res.send({
                    flag: 1,  //用户名已存在
                    des:'用户名已存在'
                })
            } else {
                User.create(req.body, function (err, data) {
                    if (err) throw err;
                    res.send({
                        flag: 0,  //注册成功
                        des:'用户添加成功'
                    })
                })
            }
    })
})

//添加粉丝
router.post('/addFans', function (req, res) {
    Fans.create(req.body, function (err, data) {
        if (err) throw err;
        res.send({
            flag: 0,  //注册成功
            des:'用户添加成功'
        })
      })
            
    })
})

// 查询所有用户信息路由
router.get('/userList', function (req, res) {
     User.aggregate([{ $lookup: { from: 'fans', localField: 'username', foreignField: 'parent_name', as: 'myfans' } },
        {$lookup:{from:'fans',localField:'username',foreignField:'fans_name',as:'myloves'}}], function (err, data) {
         if (err) throw err;
         res.send(data)
   });
    
});

然后在前端调用接口获取全部用户信息即可看到你要的效果了(返回粉丝myfans和关注myloves的用户情况,因为我要显示的是数量,所以就直接用myfans.length来获取数字了)

小白的全栈进阶之路真的不容易啊,感谢各路网友大神们的博客简书分享,你们太重要了

发布了25 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_40425415/article/details/104725842