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

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

Mongoose 多表(N个表)关联查询代码实现

首先我们需要创建db.js(连接数据库)的模块

  1. var mongoose = require('mongoose');
  2.  
  3. mongoose.connect('mongodb://127.0.0.1:27017/eggcms',{ useNewUrlParser: true },function(err){
  4. if(err){
  5. console.log(err);
  6. return;
  7. }
  8. console.log('数据库连接成功')
  9. });
  10.  
  11. module.exports = mongoose;

通过上面的需求我们需要建立三个model模块分别是article.js,articlecate.js,user.js

  1. var mongoose = require('./db.js');
  2. var Schema = mongoose.Schema;
  3.  
  4. var ArticleSchema = new Schema({
  5. title: {
  6. type: String,
  7. unique: true
  8. },
  9. cid: { // 分类id
  10. type: Schema.Types.ObjectId
  11. },
  12.  
  13. author_id:{ // 用户的id
  14. type: Schema.Types.ObjectId
  15. },
  16. author_name:{
  17. type:String
  18. },
  19. descripton: String,
  20. content: String
  21. });
  22.  
  23. module.exports = mongoose.model('Article',ArticleSchema,'article');
  1. var mongoose = require('./db.js');
  2.  
  3. var ArticleCateSchema = new mongoose.Schema({
  4. title : {
  5. type: String,
  6. unique: true
  7. },
  8. descripton: String,
  9. addtime: {
  10. type: Date
  11. }
  12. });
  13.  
  14. module.exports = mongoose.model('ArticleCate',ArticleCateSchema,'articlecate');
  1. var mongoose = require('./db.js');
  2.  
  3. var UserSchema = new mongoose.Schema({
  4. username: {
  5. type: String,
  6. unique: true
  7. },
  8. password: String,
  9. name: String,
  10. age: Number,
  11. sex: String,
  12. tel: Number,
  13. status: {
  14. type: Number,
  15. default: 1
  16. }
  17. });
  18.  
  19. module.exports = mongoose.model('User',UserSchema,'user');

然后分别对应三个添加数据的模块article_add.js,articlecate_add.js,user_add.js

  1. var ArticleModel = require('./model/article.js');
  2.  
  3. var article = new ArticleModel();
  4. article.title="这是一个国际新闻333333333"
  5. article.cid='5cde87e21ebf22597c973f1f'; // 分类id
  6. article.author_id='5cde88f71faa8045e439838b'; // 用户id
  7. article.author_name='李四';
  8. article.descripton='这是一个国际新闻333333333333 此处省略300字';
  9. article.content='访问美国 这是一个国际新闻333333333'
  10.  
  11. article.save();
  1. var ArticleCateModel = require('./model/articlecate.js');
  2.  
  3. // 分类的增加
  4. var cate = new ArticleCateModel({
  5. title:'地方新闻',
  6. description:'地方新闻'
  7. })
  8.  
  9. cate.save();
  1. var UserModel = require('./model/user.js');
  2.  
  3. // 增加用户
  4. var user= new UserModel({
  5. username :'wangwu',
  6. password:'qwerqwerqewrq',
  7. name:'王五',
  8. age:21,
  9. sex:'男',
  10. tel:12345678987
  11. })
  12. user.save();

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

查询文章信息

  1. var ArticleModel = require('./model/article.js')
  2.  
  3. // 查询文章信息
  4. ArticleModel.find({}, (err,docs) => {
  5. console.log(docs)
  6. })

两个表关联查询

  1. var ArticleModel = require('./model/article.js');
  2.  
  3. //两个表关联查询
  4. ArticleModel.aggregate([
  5. {
  6. $lookup: {
  7. from: "articlecate",
  8. localField: "cid",
  9. foreignField: "_id",
  10. as: "cate"
  11. }
  12. }
  13.  
  14. ],function(err,docs){
  15. console.log(JSON.stringify(docs))
  16. })

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

多表关联查询

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

  1. var ArticleModel = require('./model/article.js');
  2.  
  3. // 查询文章信息 并显示文章的分类 以及文章的作者信息
  4. // 三个表关联查询
  5. ArticleModel.aggregate([
  6. {
  7. $lookup: {
  8. from: "articlecate",
  9. localField: "cid",
  10. foreignField: "_id",
  11. as: "cate"
  12. }
  13. },
  14. {
  15. $lookup: {
  16. from: "user",
  17. localField: "author_id",
  18. foreignField: "_id",
  19. as: "user"
  20. }
  21. }
  22.  
  23. ],function(err,docs){
  24. console.log(JSON.stringify(docs));
  25. })

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

  1. [{
  2. "_id": "5cde89b2ecdd5e4864bdaa44",
  3. "title": "这是一个国内新闻11111111",
  4. "cid": "5cde87ce5ac6d7551041c568",
  5. "author_id": "5cde8913a0e31553449bdf54",
  6. "author_name": "王五",
  7. "descripton": "这是一个国内新闻11111111 此处省略300字",
  8. "content": "访问美国 这是一个国内新闻11111111",
  9. "__v": 0,
  10. "cate": [{
  11. "_id": "5cde87ce5ac6d7551041c568",
  12. "title": "国内新闻",
  13. "__v": 0
  14. }],
  15. "user": [{
  16. "_id": "5cde8913a0e31553449bdf54",
  17. "status": 1,
  18. "username": "wangwu",
  19. "password": "qwerqwerqewrq",
  20. "name": "王五",
  21. "age": 21,
  22. "sex": "男",
  23. "tel": 12345678987,
  24. "__v": 0
  25. }]
  26. }, {
  27. "_id": "5cde89dc0d116f45fca7f559",
  28. "title": "这是一个国际新闻222222222222",
  29. "cid": "5cde87e21ebf22597c973f1f",
  30. "author_id": "5cde8913a0e31553449bdf54",
  31. "author_name": "王五",
  32. "descripton": "这是一个国际新闻222222222222 此处省略300字",
  33. "content": "访问美国 这是一个国际新闻222222222222",
  34. "__v": 0,
  35. "cate": [{
  36. "_id": "5cde87e21ebf22597c973f1f",
  37. "title": "国际新闻",
  38. "__v": 0
  39. }],
  40. "user": [{
  41. "_id": "5cde8913a0e31553449bdf54",
  42. "status": 1,
  43. "username": "wangwu",
  44. "password": "qwerqwerqewrq",
  45. "name": "王五",
  46. "age": 21,
  47. "sex": "男",
  48. "tel": 12345678987,
  49. "__v": 0
  50. }]
  51. }, {
  52. "_id": "5cde8a078a1ab250f4dbb8e0",
  53. "title": "这是一个国际新闻333333333",
  54. "cid": "5cde87e21ebf22597c973f1f",
  55. "author_id": "5cde88f71faa8045e439838b",
  56. "author_name": "李四",
  57. "descripton": "这是一个国际新闻333333333333 此处省略300字",
  58. "content": "访问美国 这是一个国际新闻333333333",
  59. "__v": 0,
  60. "cate": [{
  61. "_id": "5cde87e21ebf22597c973f1f",
  62. "title": "国际新闻",
  63. "__v": 0
  64. }],
  65. "user": [{
  66. "_id": "5cde88f71faa8045e439838b",
  67. "status": 1,
  68. "username": "lisi",
  69. "password": "13214lkisisgfdsgsdsg",
  70. "name": "李四",
  71. "age": 20,
  72. "sex": "男",
  73. "tel": 124212142151,
  74. "__v": 0
  75. }]
  76. }]

Mongoose 多表(N个表)关联查询aggregate的更多相关文章

  1. Mongoose 两个表关联查询aggregate 以及 Mongoose中获取ObjectId

    Mongoose 两个表关联查询aggregate 通常两个表关联查询的时候,是一种一对多的关系,比如订单与订单详情就是一对多的关系,一个订单下面有多个商品 数据模拟 首先我们先将数据模拟出来,先选择 ...

  2. sql关联查询—将一个表的查询结果作为新表进行查询操作

    例题:#  各个部门中 最高工资中最低的那个部门的 最低工资是多少? 先考虑取得各个部门最高工资 SELECT MAX(salary) AS max_salary,e.`department_id` ...

  3. Mongoose中关联查询populate的使用

    MongoDB中没有join的特性,因此无法使用join进行表的连接和关联查询,在Mongoose中封装了populate方法,在定义一个 Schema 的时候可以指定了其中的字段(属性)是另一个Sc ...

  4. SQL语句关联查询

    一:连接类型: 关联查询:只有存在关联的表才能关联查询,完全独立的表之间无法关联 1.关联的类型:自关联,左关联,右关联,全关联(full join)两张表都是主表 2.关联的表:两张以上,以一张(或 ...

  5. JDBC MySQL 多表关联查询查询

    public static void main(String[] args) throws Exception{ Class.forName("com.mysql.jdbc.Driver&q ...

  6. C#代码中实现两个表(DataTable)的关联查询(JOIN)

    之前通常都是使用SQL直接从数据库中取出表1和表2关联查询后的数据,只需要用一个JOIN就可以了,非常方便.近日遇到一种情况,两个表中的数据已经取到代码中,需要在代码中将这两个表关联起来,并得到它们横 ...

  7. Spring+MyBatis框架中sql语句的书写,数据集的传递以及多表关联查询

    在很多Java EE项目中,Spring+MyBatis框架经常被用到,项目搭建在这里不再赘述,现在要将的是如何在项目中书写,增删改查的语句,如何操作数据库,以及后台如何获取数据,如何进行关联查询,以 ...

  8. Yii2中多表关联查询(join、joinwith)

    我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order      (id  order_name ...

  9. MSSQL N张表关联查询

    declare @newTime varchar(50); declare @lasetTime varchar(50); set @newTime= getdate(); set @lasetTim ...

随机推荐

  1. Python基础之面向对象编程

    面向对象编程 —— Object Oriented Programming 简写 OOP 01. 面向对象基本概念 我们之前学习的编程方式就是 面向过程 的 面向过程 和 面向对象,是两种不同的 编程 ...

  2. jsp代码中实现下拉选项框的回显代码

    用到了c标签库:首先要在jsp中导入jstl的核心库标签 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/js ...

  3. statsvn使用小记

    准备工作 1.安装TortoiseSVN,在安装时需要安装svn命令行工具: 2.拉取svn代码: svn co https://svn.myserver.cn/svn/myproject1\trun ...

  4. HTNL5-ARIA role属性

    WAI-ARIA Web Accessibility Initiative’s Accessible Rich Internet Applications 无障碍网页倡议–无障碍的富互联网应用,也简称 ...

  5. MobX入门示例

    在相当长的一段时间内,Redux 都是前端开发人员作为状态管理的首先框架,如果不会 Redux,你都不好意思跟别人说自己是搞前端的. 没过多久,开发者们开始意识到,这东西虽说盛行,但它并没有传说中的那 ...

  6. 浅谈Python设计模式 - 原型模式

    声明,本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 在<精通Python设计模式>中把设计模式分为三种类型: 创建型模式 ...

  7. Nginx 配置及参数详解

    Nginx 配置及参数详解 Nginx Location 指令语法 如下就是常用的 location 配置的语法格式,其中modifier是可选的,location_match就是制定 URI 应该去 ...

  8. linux日志详解-摘录

    小编言:会看Linux日志是非常重要的,不仅在日常操作中可以迅速排错,也可以快速的定位.` Liunx的配置文件在/etc/rsyslog.d里,可以看到如下信息这里的意思是将不通的所有优先级的信息输 ...

  9. iView学习笔记(四):Form表单操作

    1.后端准备 环境说明 python版本:3.6.6 Django版本:1.11.8 数据库:MariaDB 5.5.60 新建Django项目,在项目中新建app,配置好数据库 2.后端代码(基于C ...

  10. Detectron2源码阅读笔记-(二)Registry&build_*方法

    ​ Trainer解析 我们继续Detectron2代码阅读笔记-(一)中的内容. 上图画出了detectron2文件夹中的三个子文件夹(tools,config,engine)之间的关系.那么剩下的 ...