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 ...
随机推荐
- Python基础之面向对象编程
面向对象编程 —— Object Oriented Programming 简写 OOP 01. 面向对象基本概念 我们之前学习的编程方式就是 面向过程 的 面向过程 和 面向对象,是两种不同的 编程 ...
- jsp代码中实现下拉选项框的回显代码
用到了c标签库:首先要在jsp中导入jstl的核心库标签 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/js ...
- statsvn使用小记
准备工作 1.安装TortoiseSVN,在安装时需要安装svn命令行工具: 2.拉取svn代码: svn co https://svn.myserver.cn/svn/myproject1\trun ...
- HTNL5-ARIA role属性
WAI-ARIA Web Accessibility Initiative’s Accessible Rich Internet Applications 无障碍网页倡议–无障碍的富互联网应用,也简称 ...
- MobX入门示例
在相当长的一段时间内,Redux 都是前端开发人员作为状态管理的首先框架,如果不会 Redux,你都不好意思跟别人说自己是搞前端的. 没过多久,开发者们开始意识到,这东西虽说盛行,但它并没有传说中的那 ...
- 浅谈Python设计模式 - 原型模式
声明,本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 在<精通Python设计模式>中把设计模式分为三种类型: 创建型模式 ...
- Nginx 配置及参数详解
Nginx 配置及参数详解 Nginx Location 指令语法 如下就是常用的 location 配置的语法格式,其中modifier是可选的,location_match就是制定 URI 应该去 ...
- linux日志详解-摘录
小编言:会看Linux日志是非常重要的,不仅在日常操作中可以迅速排错,也可以快速的定位.` Liunx的配置文件在/etc/rsyslog.d里,可以看到如下信息这里的意思是将不通的所有优先级的信息输 ...
- iView学习笔记(四):Form表单操作
1.后端准备 环境说明 python版本:3.6.6 Django版本:1.11.8 数据库:MariaDB 5.5.60 新建Django项目,在项目中新建app,配置好数据库 2.后端代码(基于C ...
- Detectron2源码阅读笔记-(二)Registry&build_*方法
Trainer解析 我们继续Detectron2代码阅读笔记-(一)中的内容. 上图画出了detectron2文件夹中的三个子文件夹(tools,config,engine)之间的关系.那么剩下的 ...