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 = 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();
当我们添加了一些数据之后再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}]
}]