mongoose多个连接_Mongoose 多表(N个表)关联查询aggregate

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

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

mongoose多个连接_Mongoose 多表(N个表)关联查询aggregate_第1张图片

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 = newSchema({

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 = newmongoose.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 = newmongoose.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 = newArticleModel();

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 = newArticleCateModel({

title:'地方新闻',

description:'地方新闻'})

cate.save();

var UserModel = require('./model/user.js');//增加用户

var user= newUserModel({

username :'wangwu',

password:'qwerqwerqewrq',

name:'王五',

age:21,

sex:'男',

tel:12345678987})

user.save();

mongoose多个连接_Mongoose 多表(N个表)关联查询aggregate_第2张图片

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

查询文章信息

var ArticleModel = require('./model/article.js')//查询文章信息

ArticleModel.find({}, (err,docs) =>{

console.log(docs)

})

mongoose多个连接_Mongoose 多表(N个表)关联查询aggregate_第3张图片

两个表关联查询

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

})

2215d0a73ba41f45bb0501dfb56a8f0a.png

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

mongoose多个连接_Mongoose 多表(N个表)关联查询aggregate_第4张图片

多表关联查询

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

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

})

8115beee88845207307d7561922acb90.png

将其转成正常的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}]

}]

你可能感兴趣的:(mongoose多个连接)