聚合查询

109 阅读2分钟

文档日期:2021/2/2

参考文档:mongoose 5.x中文文档 链接地址

文档记录:刘俊雄

涉及到用户信息的使用 populate 其它场景使用聚合查询 并且注意表名是否是复数形式的

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();

查询文章信息

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))
})

多表关联查询

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

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));
})