• Mongoose 多表(N个表)关联查询aggregate


    Mongoose 多表(N个表)关联查询概述

    需求:文章(article),文章分类(articlecate),用户(user)这三个表之间的关系,一篇文章对应文章分类表中的某个类型,对应着用户表中的某个用户

    Mongoose 多表(N个表)关联查询代码实现

    首先我们需要创建db.js(连接数据库)的模块

    var mongoose = require('mongoose');
    
    mongoose.connect('mongodb://127.0.0.1:27017/eggcms',{ useNewUrlParser: true },function(err){
      if(err){
        console.log(err);
        return;
      }
      console.log('数据库连接成功')
    });
    
    module.exports = mongoose;

    通过上面的需求我们需要建立三个model模块分别是article.js,articlecate.js,user.js

    var mongoose = require('./db.js');
    var Schema = mongoose.Schema;
    
    var ArticleSchema = new Schema({
        title: {
            type: String,
            unique: true
        },
        cid: { // 分类id
            type: Schema.Types.ObjectId
        },
    
        author_id:{ // 用户的id
            type: Schema.Types.ObjectId
        },
        author_name:{
            type:String
        },
        descripton: String,
        content: String
    });
    
    
    module.exports = mongoose.model('Article',ArticleSchema,'article');
    var mongoose = require('./db.js');
    
    var ArticleCateSchema = new mongoose.Schema({
        title  : {
            type: String,
            unique: true
        },
        descripton: String,
        addtime: {
            type: Date
        }
    });
    
    
    module.exports = mongoose.model('ArticleCate',ArticleCateSchema,'articlecate');
    var mongoose = require('./db.js');
    
    var UserSchema = new mongoose.Schema({
        username: { 
            type: String, 
            unique: true 
        },
        password: String,
        name: String,
        age: Number,
        sex: String,
        tel: Number,
        status: {
            type: Number,
            default: 1
        }
    });
    
    module.exports = mongoose.model('User',UserSchema,'user');

    然后分别对应三个添加数据的模块article_add.js,articlecate_add.js,user_add.js

    var ArticleModel = require('./model/article.js');
    
    var article = new ArticleModel();
    article.title="这是一个国际新闻333333333"
    article.cid='5cde87e21ebf22597c973f1f';   // 分类id
    article.author_id='5cde88f71faa8045e439838b'; // 用户id
    article.author_name='李四';
    article.descripton='这是一个国际新闻333333333333 此处省略300字';
    article.content='访问美国 这是一个国际新闻333333333'
    
    
    article.save();
    var ArticleCateModel = require('./model/articlecate.js');
    
    
    // 分类的增加
    var cate = new ArticleCateModel({
      title:'地方新闻',
      description:'地方新闻'
    })
    
    cate.save();
    var UserModel = require('./model/user.js');
    
    // 增加用户
    var user= new UserModel({
      username  :'wangwu',
      password:'qwerqwerqewrq',
      name:'王五',
      age:21,
      sex:'男',
      tel:12345678987
    })
    user.save();

    当我们添加了一些数据之后再app.js中进行数据库查询的操作

    查询文章信息

    var ArticleModel = require('./model/article.js')
    
    // 查询文章信息
    ArticleModel.find({}, (err,docs) => {
      console.log(docs)
    })

    两个表关联查询

    var ArticleModel = require('./model/article.js');
    
    
    //两个表关联查询
    ArticleModel.aggregate([
      {
        $lookup: {
          from: "articlecate",
          localField: "cid",
          foreignField: "_id",
          as: "cate"
        }
      }
    
    ],function(err,docs){
      console.log(JSON.stringify(docs))
    })

    将其转成正常的JSON便于查看效果

    多表关联查询

    查询文章信息 并显示文章的分类 以及文章的作者信息

    var ArticleModel = require('./model/article.js');
    
    // 查询文章信息 并显示文章的分类 以及文章的作者信息
    // 三个表关联查询
    ArticleModel.aggregate([
    {
      $lookup: {
        from: "articlecate",
        localField: "cid",
        foreignField: "_id",
        as: "cate"
      }
    },
    {
      $lookup: {
        from: "user",
        localField: "author_id",
        foreignField: "_id",
        as: "user"
      }
    }
    
    ],function(err,docs){
      console.log(JSON.stringify(docs));
    })

    将其转成正常的JSON便于查看效果

    [{
        "_id": "5cde89b2ecdd5e4864bdaa44",
        "title": "这是一个国内新闻11111111",
        "cid": "5cde87ce5ac6d7551041c568",
        "author_id": "5cde8913a0e31553449bdf54",
        "author_name": "王五",
        "descripton": "这是一个国内新闻11111111 此处省略300字",
        "content": "访问美国 这是一个国内新闻11111111",
        "__v": 0,
        "cate": [{
            "_id": "5cde87ce5ac6d7551041c568",
            "title": "国内新闻",
            "__v": 0
        }],
        "user": [{
            "_id": "5cde8913a0e31553449bdf54",
            "status": 1,
            "username": "wangwu",
            "password": "qwerqwerqewrq",
            "name": "王五",
            "age": 21,
            "sex": "男",
            "tel": 12345678987,
            "__v": 0
        }]
    }, {
        "_id": "5cde89dc0d116f45fca7f559",
        "title": "这是一个国际新闻222222222222",
        "cid": "5cde87e21ebf22597c973f1f",
        "author_id": "5cde8913a0e31553449bdf54",
        "author_name": "王五",
        "descripton": "这是一个国际新闻222222222222 此处省略300字",
        "content": "访问美国 这是一个国际新闻222222222222",
        "__v": 0,
        "cate": [{
            "_id": "5cde87e21ebf22597c973f1f",
            "title": "国际新闻",
            "__v": 0
        }],
        "user": [{
            "_id": "5cde8913a0e31553449bdf54",
            "status": 1,
            "username": "wangwu",
            "password": "qwerqwerqewrq",
            "name": "王五",
            "age": 21,
            "sex": "男",
            "tel": 12345678987,
            "__v": 0
        }]
    }, {
        "_id": "5cde8a078a1ab250f4dbb8e0",
        "title": "这是一个国际新闻333333333",
        "cid": "5cde87e21ebf22597c973f1f",
        "author_id": "5cde88f71faa8045e439838b",
        "author_name": "李四",
        "descripton": "这是一个国际新闻333333333333 此处省略300字",
        "content": "访问美国 这是一个国际新闻333333333",
        "__v": 0,
        "cate": [{
            "_id": "5cde87e21ebf22597c973f1f",
            "title": "国际新闻",
            "__v": 0
        }],
        "user": [{
            "_id": "5cde88f71faa8045e439838b",
            "status": 1,
            "username": "lisi",
            "password": "13214lkisisgfdsgsdsg",
            "name": "李四",
            "age": 20,
            "sex": "男",
            "tel": 124212142151,
            "__v": 0
        }]
    }]
  • 相关阅读:
    java代码终于过百行了
    团队建设中人员流失的问题
    将析构函数设置为虚函数,并且析构函数可以为纯虚函数
    J2EE学习笔记——JSP使用Fckeditor
    Android ListView的getview()中position错位 重复调用(position重复调用)
    修正Thinkphp 3.2 分页Page类以支持URL路由
    ThinkPHP中_after_update、_before_update等的用法
    ThinkPHP跨控制器调用方法
    Thinkphp 查询条件 and 和 or同时使用即复合查询
    layer弹出图片的问题
  • 原文地址:https://www.cnblogs.com/LO-ME/p/10883032.html
Copyright © 2020-2023  润新知