node.js使用mongoose做多集合关联查询

使用mongoose做多集合关联查询 在使用node开发后端项目的时候,通常会选择mongodb作为数据库,而使用mongodb通常是选择mongoose作为操作mongodb的驱动。首先我们知道mongodb是非关系型的的数据库,也就是说保存的每行数据的字段都可以不一样、不统一,我们以一个简单博客系统的数据为例,涉及到的数据信息可能会有用户、文章、留言。小明发一篇文章, 那么小明的数据如下: 两篇文章: 还有每篇文章都可能有留言的,例如小红给小明的文章留言,那么数据就会如下: 小王也给小明的文章留言,那么数据如下: 问题来了,因为文章信息、留 阅读详情

在使用node开发后端项目的时候,通常会选择mongodb作为数据库,而使用mongodb通常是选择mongoose作为操作mongodb的驱动。

首先我们知道mongodb是非关系型的的数据库,也就是说保存的每行数据的字段都可以不一样、不统一,我们以一个简单博客系统的数据为例,涉及到的数据信息可能会有用户、文章、留言。

小明发一篇文章, 那么小明的数据如下:

{
	name:'小明',
	articles:[
		{
			content:'这是一篇文章内容'
		}
	]
}

两篇文章:

{
	name:'小明',
	articles:[
		{
			content:'这是一篇文章内容'
		},
		{
			content:'这是第二篇文章的内容'
		}
	]
}

还有每篇文章都可能有留言的,例如小红给小明的文章留言,那么数据就会如下:

{
	name:'小明',
	articles:[
		{
			content:'这是一篇文章内容',
			msgs:[
				{
					name:'小红',
					content:'小红给小明的留言'
				}
			]
		},
		{
			content:'这是第二篇文章的内容',
			msgs:[
				{
					name:'小红',
					content:'小红给小明第二篇文章的留言'
				}
			]
		}
	]
}

小王也给小明的文章留言,那么数据如下:

{
	name:'小明',
	articles:[
		{
			content:'这是一篇文章内容',
			msgs:[
				{
					name:'小红',
					content:'小红给小明的留言'
				},
				{
					name:'小王',
					content:'小王给小明的留言!!'
				}
			]
		},
		{
			content:'这是第二篇文章的内容',
			msgs:[
				{
					name:'小红',
					content:'小红给小明第二篇文章的留言'
				},
				{
					name:'小王',
					content:'小王小明第二篇文章的留言!!'
				}
			]
		}
	]
}

问题来了,因为文章信息、留言信息都是保存在用户的信息下,如果某个用户的信息修改了,那么都需要遍历其他的用户的数据去做修改,如:小红的信息修改了,那么也需要去小明的文章下找到小红的信息去修改。 或者需要修改文章也需要通过用户的信息去修改。 这样就比较麻烦了,也不高效。

于是就有了数据库关系查询,mongodb也是最像关系型数据库的非关系型数据库,就是让他们的相同类别数据存在同一个集合(表)中, 让行内的某个字段做集合与集合之间的对应关系,通常是用id作为集合之间的映射关系。

我们直接使用mongoose操作mongodb:

首先准备三个集合(表)

users 存放用户信息

articles 存放文章信息,每篇文章都属于某个用户(用user字段和users的_id字段做关联)

msgs : 存放留言信息,每条留言都属于某个用户,每条留言也属于某篇文章(用user字段和users的_id字段做关联, 用article字段和articles的_id做关联)

关系如下图:

对应的Scheme (_id字段在保存数据的时候会自动添加,所以我们不用定义)

userModel.js

const mongoose = require('./db');
const schema = mongoose.Schema({
	username:String,
	password: String	
},{collection:'users'})

const model = mongoose.model('users',schema)
module.exports = model;

articleModel.js

const mongoose = require('./db');
const schema = mongoose.Schema({
	title: String,
	content: String,
	user: {type: mongoose.Schema.Types.ObjectId, ref:'users'}
},{collection:'articles'})

const model = mongoose.model('articles',schema)
module.exports = model;

msgModel.js

const mongoose = require('./db');
const schema = mongoose.Schema({
	content: String,
	user: {type: mongoose.Schema.Types.ObjectId, ref:'users'},
	article: {type: mongoose.Schema.Types.ObjectId, ref:'articles'},
},{collection:'msgs'})

const model = mongoose.model('msgs',schema)
module.exports = model;

关联查询(一对一)

1.查询文章对应查询文章的用户信息

使用populate方法填充方法

参数1: 需要查询的关联字段

参数2: 关联查询出来的信息需要显示字段

articleModel.find().populate('user','username avatar').exec(function(err,as){
	console.log(as)
})

这样查询出来的文章信息都带有用户信息,而不是只有一个用户id

关联查询(一对多)

想要查询文章,然后查询出关于这篇的所有留言

1.聚合查询方式:

在这里的话,需要用到聚合查询,查询方式如下

// 多集合关联查询
articleModel.aggregate([
	{
		$lookup:{
			from:'msgs',  // 关联的集合
			localField:'_id',  // 本地关联的字段
			foreignField:'article',  // 对方集合关联的字段
			as:'mms',  // 结果字段名,
		},
	}
],(err,dds)=>{
	console.log(dds)
})

使用aggregate()方法就可以使用聚合查询了,方法接收一个数组参数

$lookup是关联查询的意思,就像SQL中的join

2.虚拟字段查询方式

在articleModel.js 中添加如下代码

schema.virtual('mms',{ // 参数1为加的虚拟字段名称
	ref:'msgs', //关联查询的集合
	localField: '_id',  // 当前集合和对方集合关联的字段
  foreignField: 'article',  // 对方集合字段和本集合关联的字段
  count: true   // count是否只显示总条数;  true为显示,   false为不显示
})

// 下面这两句只有加上了, 虚拟字段才可以显性的看到,不然只能隐性使用
schema.set('toObject',{virtuals:true})
schema.set('toJSON',{virtuals:true})

virtual 方法是给schema添加虚拟字段,

参数1 : 虚拟字段的名称

参数2: 虚拟字段的配置

然后通过populate查询

articleModel.find().populate('mms').exec((err,as)=>{
	console.log(as)
})

这样查询出来的文章列表就有个mms字段了,这个字段对应的这篇文章的留言总数

以上就是使用mongoose 做多集合关联查询的方法。

总结

一对一关系的集合可以通过populate填充查询。

一对多关系的集合可以通过聚合和虚拟字段进行查询

【Node.js】mongoose教程06--排序 Sodino本文的查询是指存储了5个手机数据后再查询。存储实现见文章:【Node.js】mongoose教程—存储。GitHub源码链接:sodino#MongoDemo排序文档链接12345678910111213141516171819Query#sort(arg) Sets the sort orderParameters: arg Object, String>Returns: 阅读详情

相关推荐

Node.js | MongoDB 入门讲解 & Mongoose 模块的初步应用

既然我们学习了NodeJS,正式进入了后端开发的领域,那么数据库的知识就必不可少了,这篇文章我们将去学习如何在NodeJS中应用非关系型数据库MongoDB,后期也会学习如何应用关系型数据库MySql。由于本专栏是针对NodeJS的,所以本篇文章侧重于讲解NodeJS如何连接并操作MongoDB数据库,并不会对MongoDB的安装配置以及原生的操作语法做过多的讲解(这些网上已经有很多的教程了,想深入了解的可自行搜索)。

前端之行,任重道远! 7665

【Node.js】mongoose教程05--查询

Sodino文章目录1. Model与Query2. 查询全部数据3. 条件查询4. 条件查询—数组5. 组合条件查询本文的查询是指存储了5个手机数据后再查询。存储实现见文章:【Node.js】mongoose教程—存储。GitHub源码链接:sodino#MongoDemoModel与QueryModel.find()方法会返回Query对象。Model.find()方法原型如下:1234567

Sodino的专栏 1515

Node.js与MongoDB项目实战:使用Mongoose进行数据操作

本文还有配套的精品资源,点击获取 简介:本项目介绍了如何在Node.js应用程序中集成MongoDB数据库,使用Mongoose库进行数据操作。介绍了Node.js和MongoDB的基础知识、Mongoose的安装与连接方法、数据模型的定义与操作,以及中间件的应用和项目文件结构等。通过本项目,可以掌握Node.js使用Mongoose操作MongoDB的完整流程,包括数据的...

weixin_35749440的博客 2239

mongoose 笔记

Mongoose所有的一切始于Schema。每一个Schema都映射到MongoDB中的collection(集合)和定义了document(文档)的结构。meta: {});如果想要在创建Schema以后添加额外的key,可以使用Schema的add方法。现在只需要知道SchemaTypes有:StringNumberDateBufferBooleanMixedObjectIdArray。

2401_84150102的博客 1262

构建Node.js后端应用:Mongoose数据模型实战

本文还有配套的精品资源,点击获取 简介:本文档详细介绍了使用Mongoose库在JavaScript环境下操作MongoDB数据库的过程。主要围绕用户、产品、分类和订单四个核心概念的模型设计与CRUD操作实践,涵盖数据类型选择、验证规则、静态与实例方法定义以及模型间关联等关键点。通过对这些概念的理解与应用,读者可以提升在Node.js开发中对数据库管理的技能水平。 ...

weixin_35516624的博客 1556

opencode 完全指南:终端AI编程助手的安装、模型配置与实战

在AI编程助手快速迭代的当下,开发者对终端环境下的自动化编码需求愈发强烈。以自然语言驱动代码修改、命令执行与测试验证,已成为提升工程效率的重要方向。这类工具普遍遵循模型无关的设计原则,通过兼容OpenAI格式的接口接入多种大模型,并借助多会话管理、Skills、Memory等机制实现可审查、可干预的闭环流程。从安装配置到日常使用,再到apihub网关与免费模型的接入,终端AI助手在代码审查、跨文件重构、浏览器自动化验证等场景中展现出独特价值。本文聚焦opencode这一开源CLI工具,详细拆解其核心定位、模

weixin_33868027的博客 417

Node.js 连接 MongoDB-查询数据库

友情提示: 耐心一步步看,必有收获! cmd 命令行复制用回车 退出当前活动 ctrl+c 一次不行就两次

qq_33274031的博客 1492

【73页PPT】美的简单高效的管理逻辑(附下载方式)

其科技领先战略依托四级研发体系(中央研究院、事业部、前沿技术、产品开发)与 “三个一代” 模式(开发一代、储备一代、研究一代),构建全球研发布局(“2+4+N” 体系,含顺德、上海双总部,美、德、意、日四大研发中心及分布式创新节点),研发投入强度持续提升。MBS(美的精益运营体系)以 “12345” 为方法论:始于客户需求,借鉴顶级企业实践,以战略部署、人才育成、日常管理为核心,追求质量、交付、成本、创新四大目标,通过精益五步法(定价值、析流、促流动、拉系统、尽善美)实现全链条优化。

2501_92808811的博客 1102

nodeJs实现本地数据库json格式储存增删改查

nodeJs实现本地数据库json格式储存增删改查概述增删改查注意事项(踩坑)当写入的时候不存在文件,则自动创建文件的方法 概述 nodeJs实现本地数据库、 nodeJs中fs.writeFile的坑 在写一个移动端vue项目的时候突发奇想,既然MongoDB 存储的json 格式的数据,那能不能在写接口的时候在接口文件中 直接创建一个db 文件 储存 数据呢? 学过 nodeJs fs模块的同学或许不知道它的强大, 通过fs 模块,我们完全可以实现 数据的增删改查,下面 直接上代码吧。 先看一下目录

weixin_44308055的博客 2828

粒子群算法实战:用Matlab解决旅行商问题(TSP)的完整代码解析

本文提供了使用粒子群算法解决旅行商问题的完整Matlab实战指南。通过将连续空间的粒子群算法进行离散化改造,采用基于交换序的策略来更新粒子位置与速度,并给出了从问题定义、数据结构设计、核心函数实现到主迭代循环的详细代码解析。文章还探讨了参数调优、性能优化及处理复杂TSP变体的进阶思路,为物流规划、路径优化等领域的工程应用提供了可直接复用的解决方案。

m2n3o4p5的博客 350

Qwen3-Omni-30B-A3B-Instruct微调指南:如何打造专属智能博物官(附数据集)

本文详细介绍了如何对Qwen3-Omni-30B-A3B-Instruct模型进行微调,以打造专业的智能博物官。指南涵盖了从理解模型架构优势、构建高质量文博数据集,到使用LLaMA-Factory进行实战微调、效果评估与部署优化的完整流程,并提供了关键的环境配置与性能优化建议,帮助开发者在垂直领域高效定制专属AI助手。

weixin_29096377的博客 1143

Nodejs中mongodb的使用及封装,前端经典入门教程,挥泪整理面经

集合(表)操作建:db.createCollection(‘表名’,{配置})//配置:{size:文件大小,capped:true,max:条数|文档数} capped定量//db.表(集合).isCapped() 返回 true/false 是否是定量查:show collections / db.getCollectionNames()删:db.表|集合.drop()文档(row)操作增db.集合.save({}) //添加一条db.集合.insert({}) //添加一条。

code8889的博客 1303

2025_NIPS_Truthful Aggregation of LLMs with an Application to Online Advertising

大型语言模型(LLMs)生成内容的 revenue 变现是在线广告的下一个前沿领域。我们考虑这样一种场景:广告商旨在影响LLM的回复,而平台则寻求最大化广告商价值并确保用户满意度。核心挑战在于,广告商的偏好通常与用户偏好存在冲突,且广告商可能误报其偏好。为解决这一问题,我们提出MOSAIC——一种拍卖机制,它确保真实申报是广告商的占优策略,并使每个广告商的效用与其对社会福利的贡献保持一致。重要的是,该机制无需LLM微调或访问模型权重,且随着计算资源的增加,可证明收敛到最优微调LLM的输出。

c_cpp_csharp的专栏 80

在 Node.js 中如何使用 MongoDB 创建多个关联模型

确保在 `Post` 模型中正确设置了 `user` 字段作为 `ObjectId`,并且在查询时通过 `populate` 将 `user` 字段展开成完整的用户数据。在 `Post` 模型中,`user` 字段引用了 `User` 模型的 `_id`,这表示每个帖子的创建者是某个用户。`Post` 模型表示帖子的基本信息,每个帖子关联到一个用户。假设我们有两个模型:`User` 和 `Post`。- `populate()` 会通过外键(`ObjectId`)来填充另一个文档的数据。

hxy132的博客 1414

Cesium 场景特效之【全球海洋】GL2兼容版

Cesium 场景特效之【全球海洋】GL2兼容版

喜欢钻研前端和分享技术 1278

基于DO-178C/331的飞控软件研发环境的研究

本研究提出了一套基于DO-178C/331标准的飞控系统软件开发和验证框架。通过优化模型库的设计、代码生成配置和测试验证流程,显著提升了飞控系统软件的开发效率和安全性。未来的研究可以进一步扩展模型库的功能,以适应更复杂的飞控系统需求。

qq_41854911的博客 561

Mongoose中关联查询populate的使用

2场景: 文章表中的每一篇文章article,都属于一个分类part,现在要获取文章列表,并在列表中展示文章属于哪个分类,也就是说根据文章找到其所在分类的名称。这时,我们需要用到Mongoose中的关联查询populate 用法: 1.定义文章Article模式 关键是使用ref关联到Part模式 const mongoose = require('./dbUtlis') cons...

monkeyHI 1436

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Node.js中实现MongoDB数据库的索引、多表关联查询

Node.js中实现MongoDB数据库的索引、多表关联查询

SongD1114的博客 3700

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Mongoose模型关联:node-express-boilerplate复杂数据结构设计

在Node.js后端开发中,数据模型间的关联设计直接影响API性能与代码可维护性。本文基于node-express-boilerplate项目,详解Mongoose模型关联的实现方式,解决用户认证系统中的数据关联痛点,帮助开发者构建清晰的实体关系。 ## 模型关联基础架构 项目核心数据模型位于[src/models/](https://link.gitcode.com/i/2ff2ce0f4c...

gitblog_00410的博客 1004

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Node.js之Mongoose-Mongoose概述

Mongoose 是 MongoDB 的一个 JavaScript ODM (Object Document Mapping) 库,为 [[Concept-MongoDB]] 提供了一个直观的、基于模式的解决方案。它在 Node.js 环境中运行,提供了数据建模、验证、查询构建、业务逻辑钩子等功能。ODM 是一种编程技术,用于在面向对象编程语言中转换不同类型系统的数据。Mongoose 将 MongoDB 文档映射为 JavaScript 对象。fill:#333;color:#333;

weixin_40892705的博客 603

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

Mongoose 两个表关联查询aggregate 通常两个表关联查询的时候,是一种一对多的关系,比如订单与订单详情就是一对多的关系,一个订单下面有多个商品 数据模拟 首先我们先将数据模拟出来,先选择数据库 use eggcms db.order.insert({"order_id":"1","uid":10,"trade_no":"111","all_pric...

1000

Node.js+Mongoose实现MondoDB操作

1.MongoDB是什么,就是一个讲数据存储为类似JSON格式的NoSQL数据库,结构灵活。 2.Mongoose是什么,就是一个以对象形式来操作MongoDB存储的node.js库,ORM,非常方便。 3.本文章提供MongoDB安装与操作基础,以及node.js+mongoose操作mongodb,欢迎学习!!! by zhengkai.blog.csdn.net

★【World Of Moshow 郑锴】★ 2534

node-blog数据建模指南:Mongoose Schema设计与关联查询7大要点

node-blog 是一个基于 Koa2 + MongoDB 的开源博客系统,本文将以它的实战代码为例,为你拆解 Mongoose Schema 设计的完整思路与关联查询方法。无论你是刚接触 Mongoose 的新手,还是想优化博客数据结构的开发者,掌握这 7 大要点都能让你的 MongoDB 数据建模少走弯路,快速构建出结构清晰、查询高效的文章、分类与评论模块。 [![node-blog 项目

gitblog_00589的博客 407

mongoose 入门(四)使用aggregate 聚合管道、使用 populate 实现关联查询

使用aggregate 聚合管道、使用 populate 实现关联查询一、mongoose中两个表关联查询aggregate1、案例一2、案例二二、mongoose中多表(N个表)关联查询aggregate三、 Populate 实现多个表的关联查询 一、mongoose中两个表关联查询aggregate 1、案例一 db.js //连接数据库 var mongoose = require('mongoose'); //useNewUrlParser这个属性会在url里识别验证用户所需的db,未升级前

丑小鸭变黑天鹅的博客 2412
上一篇: mongoose查看数据库执行语句mongoose.set(‘debug‘, true)
下一篇: 微信小程序picker 双列案例
少杰()
博客等级 码龄4年 18粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值