mongodb实现同库联表查询方法示例
发布时间 - 2026-01-11 02:46:41 点击率:次前言

最近在工作中遇到一个问题,需要对mongodb数据库进行联表查询操作,发现网上这方面的资料较少,无奈只能自己来实现了,下面话不多说了,来一起看看详细的介绍:
注意:这里只对同库联表查询做介绍,跨库联表查询可能在之后也会介绍(因为公司架构变动,之后可能会联表查询)
我用到的联表查询有两种,一种是mongoose的populate,一种是$lookup
一、populate
populate是使用外键关联子表
例如现在有一张订单表结构(动态外键):
var orderSchema = new mongoose.Schema({
uid: { type: String, required: true }, // 用户id
amount: { type: Number, required: true },
oType: { type: Number, required: true }, // 订单类型
status: { type: Number, required: true }, // 订单的状态:1完成 2未完成 3失效
})
用户表:
var userSchema = new mongoose.Schema({
phone: String,
status: String,
createdAt: Date,
updatedAt: Date
})
现在我想根据查询order表,并返回对应用户phone字段
order.find().populate({path: 'uid', model: User, select: '_id real_name phone bankcard'}).exec(function(err, order) {
// order: {
// uid: {
// phone: '15626202554',
// status: "expand",
// createdAt: Date,
// updatedAt: Date
// },
// amount: 5000,
// oType: 2, // 订单类型
// status: 1, // 订单的状态:1完成 2未完成 3失效
// }
});
这里order表的uid指向了user表的_id字段,当然也可以在新建表的时候定义外键,这里就不细说了
二、$lookup
lookup就是使用aggregate的$lookup属性,直接上官网例子非常好懂
orders表
{ "_id" : 1, "item" : "abc", "price" : 12, "quantity" : 2 }
{ "_id" : 2, "item" : "jkl", "price" : 20, "quantity" : 1 }
{ "_id" : 3 }
inventory表
{ "_id" : 1, "sku" : "abc", description: "product 1", "instock" : 120 }
{ "_id" : 2, "sku" : "def", description: "product 2", "instock" : 80 }
{ "_id" : 3, "sku" : "ijk", description: "product 3", "instock" : 60 }
{ "_id" : 4, "sku" : "jkl", description: "product 4", "instock" : 70 }
{ "_id" : 5, "sku": null, description: "Incomplete" }
{ "_id" : 6 }
db.orders.aggregate([
{
$lookup:
{
from: "inventory",
localField: "item",
foreignField: "sku",
as: "inventory_docs"
}
}
])
就是使用order的item字段作为inventory表的查询条件{sku: item},并赋值给inventory_docs字段,但值得注意的是两个字段的类型必须一样(3.5以上貌似可以转,没试过)
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
参考文章
Mongoose中的关联表查询 && 聚合查询
在mongoose中填充外键
# mongodb
# 联表查询
# 联合查询
# 两表联合查询
# MongoDB中多表关联查询($lookup)的深入讲解
# Mongodb实现的关联表查询功能【population方法】
# MongoDB各种查询操作详解
# MongoDB查询操作限制返回字段的方法
# PHP中MongoDB数据库的连接、添加、修改、查询、删除等操作实例
# MongoDB下根据数组大小进行查询的方法
# MongoDB导出查询结果到文件例子
# MongoDB如何对数组中的元素进行查询详解
# MongoDB查询技巧总结
# MongoDB查询性能优化验证及验证
# MongoDB的基础查询和索引操作方法总结
# MongoDB多表关联查询操作实例详解
# 未完成
# 的是
# 我想
# 也会
# 就不
# 说了
# 不多
# 能在
# 非常好
# 一个问题
# 这篇文章
# 有两种
# 谢谢大家
# 较少
# 只对
# 在工作中
# 官网
# 没试过
# 实现了
# 网上
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南
php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
Swift中switch语句区间和元组模式匹配
如何快速登录WAP自助建站平台?
Laravel如何使用Gate和Policy进行授权?(权限控制)
如何基于云服务器快速搭建个人网站?
如何快速搭建高效可靠的建站解决方案?
Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】
消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工
如何在香港服务器上快速搭建免备案网站?
Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】
微信公众帐号开发教程之图文消息全攻略
Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】
做企业网站制作流程,企业网站制作基本流程有哪些?
Java垃圾回收器的方法和原理总结
Laravel模型关联查询教程_Laravel Eloquent一对多关联写法
Android自定义listview布局实现上拉加载下拉刷新功能
b2c电商网站制作流程,b2c水平综合的电商平台?
Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置
Internet Explorer官网直接进入 IE浏览器在线体验版网址
简单实现jsp分页
如何用搬瓦工VPS快速搭建个人网站?
如何用虚拟主机快速搭建网站?详细步骤解析
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
js实现获取鼠标当前的位置
高防服务器租用首荐平台,企业级优惠套餐快速部署
浅谈redis在项目中的应用
javascript中的try catch异常捕获机制用法分析
Laravel怎么自定义错误页面_Laravel修改404和500页面模板
如何制作一个表白网站视频,关于勇敢表白的小标题?
javascript基本数据类型及类型检测常用方法小结
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
如何在阿里云ECS服务器部署织梦CMS网站?
Laravel如何实现密码重置功能_Laravel密码找回与重置流程
如何快速查询网站的真实建站时间?
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
js代码实现下拉菜单【推荐】
Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南
如何在云主机快速搭建网站站点?
简历在线制作网站免费版,如何创建个人简历?
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
JavaScript如何实现错误处理_try...catch如何捕获异常?
轻松掌握MySQL函数中的last_insert_id()
深圳网站制作培训,深圳哪些招聘网站比较好?
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
网站制作壁纸教程视频,电脑壁纸网站?
Laravel Docker环境搭建教程_Laravel Sail使用指南
如何在Ubuntu系统下快速搭建WordPress个人网站?
JavaScript模板引擎Template.js使用详解

