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使用详解