文档日期: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));
})