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
}]
}]
Mongoose 多表(N个表)关联查询aggregate的更多相关文章
- Mongoose 两个表关联查询aggregate 以及 Mongoose中获取ObjectId
Mongoose 两个表关联查询aggregate 通常两个表关联查询的时候,是一种一对多的关系,比如订单与订单详情就是一对多的关系,一个订单下面有多个商品 数据模拟 首先我们先将数据模拟出来,先选择 ...
- sql关联查询—将一个表的查询结果作为新表进行查询操作
例题:# 各个部门中 最高工资中最低的那个部门的 最低工资是多少? 先考虑取得各个部门最高工资 SELECT MAX(salary) AS max_salary,e.`department_id` ...
- Mongoose中关联查询populate的使用
MongoDB中没有join的特性,因此无法使用join进行表的连接和关联查询,在Mongoose中封装了populate方法,在定义一个 Schema 的时候可以指定了其中的字段(属性)是另一个Sc ...
- SQL语句关联查询
一:连接类型: 关联查询:只有存在关联的表才能关联查询,完全独立的表之间无法关联 1.关联的类型:自关联,左关联,右关联,全关联(full join)两张表都是主表 2.关联的表:两张以上,以一张(或 ...
- JDBC MySQL 多表关联查询查询
public static void main(String[] args) throws Exception{ Class.forName("com.mysql.jdbc.Driver&q ...
- C#代码中实现两个表(DataTable)的关联查询(JOIN)
之前通常都是使用SQL直接从数据库中取出表1和表2关联查询后的数据,只需要用一个JOIN就可以了,非常方便.近日遇到一种情况,两个表中的数据已经取到代码中,需要在代码中将这两个表关联起来,并得到它们横 ...
- Spring+MyBatis框架中sql语句的书写,数据集的传递以及多表关联查询
在很多Java EE项目中,Spring+MyBatis框架经常被用到,项目搭建在这里不再赘述,现在要将的是如何在项目中书写,增删改查的语句,如何操作数据库,以及后台如何获取数据,如何进行关联查询,以 ...
- Yii2中多表关联查询(join、joinwith)
我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_name ...
- MSSQL N张表关联查询
declare @newTime varchar(50); declare @lasetTime varchar(50); set @newTime= getdate(); set @lasetTim ...
随机推荐
- C#实现电信短信SMGP协议程序源码
此程序为中国电信SMGP协议程序接口,适合在中国电信申请了短信发送端口的公司使用. 短信群发已经成为现在软件系统.网络营销等必不可少的应用工具.可应用在短信验证.信息群发.游戏虚拟商品购买.事件提醒. ...
- windows如果在IE中用超链接打开谷歌页面
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\openChrome] @="URL:openChrome Protocol& ...
- Django(一)初始
一:Web开发中的基本术语 1.两种架构 (1)cs架构 Client/Server:客户端-服务端架构 优点:CS能充分发挥客户端PC的处理能力,很多工作可以在客户端处理后在提交给服务器,用户体验好 ...
- Java自学-接口与继承 抽象类
Java 抽象类 在类中声明一个方法,这个方法没有实现体,是一个"空"方法 这样的方法就叫抽象方法,使用修饰符"abstract" 当一个类有抽象方法的时候,该 ...
- Python进阶----pymysql模块的使用,单表查询
Python进阶----pymysql模块的使用,单表查询 一丶使用pymysql 1.下载pymysql包: pip3 install pymysql 2.编写代码 ...
- spark任务运行完成后在driver端的处理逻辑
回顾 上一篇,我们分析了了任务在executor端的运行流程,任务运行结束后,在Executor.launchTask方法最后,通过调用execBackend.statusUpdate方法将任务结果以 ...
- 常用的本地存储-----cookie篇
1.引言 随着浏览器的处理能力不断增强,越来越多的网站开始考虑将数据存储在「客户端」,那么久不得不谈本地存储了. 本地存储的好处: 一是避免取回数据前页面一片空白,如果不需要最新数据也可以减少向服务器 ...
- Golang: 常用的文件读写操作
Go 语言提供了很多文件操作的支持,在不同场景下,有对应的处理方式,今天就来系统地梳理一下,几种常用的文件读写的形式. 一.读取文件内容 1.按字节读取文件 这种方式是以字节为单位来读取,相对底层一些 ...
- Linux service进程管理
Linux进程基本介绍: 1)在Linux中,每个执行的程序(代码)都称为一个进程.每一个进程都分配一个ID号. 2)每一个进程,都对应一个父进程,而这个父进程可以复制多个子进程.例如www服务器. ...
- rds - mysql修改存储过程/函数的方式
rds 不支持账户A 给账户B 创建授权存储过程,只能是当前登录账户给自己创建,要登陆对应账户删除原有存储过程重新创建即为修改. 例子如下: 先登陆新账号然后执行如下sql语句即可: DROP PRO ...