返回顶部
首页 > 资讯 > 精选 >MongoDB中如何实现多表联查
  • 403
分享到

MongoDB中如何实现多表联查

2023-07-02 16:07:40 403人浏览 薄情痞子
摘要

今天小编给大家分享一下MongoDB中如何实现多表联查的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前些天遇到一个需求,不复

今天小编给大家分享一下MongoDB中如何实现多表联查的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

前些天遇到一个需求,不复杂,用 sql 表现的话,大约如此:

SELECT *FROM db1 LEFT JOIN db2 ON db1.a = db2.bWHERE db1.userId='$me' AND db2.status=1

没想到搜了半天,我厂的代码仓库里没有这种用法,各种教程也多半只针对合并查询(即只筛选 db1,没有 db2 的条件)。所以最后只好读文档+代码尝试,终于找到答案,记录一下。

  • 我们用 monGoose 作为连接库

  • 联查需要用 $lookup

  • 如果声明外键的时候用 ObjectId,就很简单:

// 假设下面两个表 db1 和 db2export const Db1Schema = new mongoose.Schema(  {    userId: { type: String, index: true },    couponId: { type: ObjectId, ref: Db2Schema },  },  { versionKey: false, timestamps: true });export const Db2Schema = new mongoose.Schema(  {    status: { type: Boolean, default: 0 },  },  { versionKey: false, timestamps: true });// 那么只要db1Model.aggregate([  {    $lookup: {      from: 'db2', // 目标表      localField: 'couponId', // 本地字段      foreignField: '_id', // 对应的目标字段      as: 'source',  },  {    $match: [  ],  },]);

但是我们没有用 ObjectId,而是用 string 作为外键,所以无法直接用上面的联查。必须在 pipeline 里手动转换、联合。此时,当前表(db1)的字段不能直接使用,要配合 let,然后加上 $$ 前缀;连表(db2)直接加 $ 前缀即可。

最终代码如下:

mongo.ts

// 每次必有的条件,当前表的字段用 `$$`,连表的字段用 `$`const filter = [{ $eq: ['$$userId', userId] }, { $eq: ['$isDeleted', false] }];if (status === Expired) {  dateOp = '$lte';} else if (status === NORMal) {  dateOp = '$gte';  filter.push({ $in: ['$$status', [Normal, Shared]] });} else {  dateOp = '$gte';  filter.push({ $eq: ['$$status', status] });}const results = await myModel.aggregate([  {    $lookup: {      from: 'coupons',      // 当前表字段必须 `let` 之后才能用      let: { couponId: '$couponId', userId: '$userId', status: '$status' },      // 在 pipeline 里完成筛选      pipeline: [        {          $match: {            $expr: {              // `$toString` 是内建方法,可以把 `ObjectId` 转换成 `string`              $and: [{ $eq: [{ $toString: '$_id' }, '$$couponId'] }, ...filter, { [dateOp]: ['$endAt', new Date()] }],            },          },        },        // 只要某些字段,在这里筛选        {          $project: couponFields,        },      ],      as: 'source',    },  },  {    // 这种筛选相当 LEFT JOIN,所以需要去掉没有连表内容的结果    $match: {      source: { $ne: [] },    },  },  {    // 为了一次查表出结果,要转换一下输出格式    $facet: {      results: [{ $skip: size * (page - 1) }, { $limit: size }],      count: [        {          $count: 'count',        },      ],    },  },]);

同事告诉我,这样做的效率不一定高。我觉得,考虑到实际场景,他说的可能没错,不过,早晚要迈出这样的一步。而且,未来我们也应该慢慢把外键改成 ObjectId 类型。

以上就是“mongoDB中如何实现多表联查”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: MongoDB中如何实现多表联查

本文链接: https://lsjlt.com/news/342911.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MongoDB中如何实现多表联查
    今天小编给大家分享一下MongoDB中如何实现多表联查的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前些天遇到一个需求,不复...
    99+
    2023-07-02
  • MongoDB中实现多表联查的实例教程
    前些天遇到一个需求,不复杂,用 SQL 表现的话,大约如此: SELECT * FROM db1 LEFT JOIN DB2 ON db1.a = db2.b WHERE db1.userId='$me'...
    99+
    2024-04-02
  • MySQL多表联查如何实现
    本文小编为大家详细介绍“MySQL多表联查如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“MySQL多表联查如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。多表联查场景一对一用户与用户信息表:当用户...
    99+
    2023-07-05
  • 怎么在java中使用mongodb实现多表联查
    这期内容当中小编将会给大家带来有关怎么在java中使用mongodb实现多表联查,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。多表联查的查询语句:此处使用的为mongodb的robo3t可视化工具,先说下...
    99+
    2023-06-14
  • java操作mongodb之多表联查的实现($lookup)
    最近在开发的过程中,一个列表的查询,涉及到了多表的关联查询,由于持久层使用的是mongodb,对这个非关系型数据使用的不是很多,所以在实现此功能的过程中出现了不少问题,现在此做记录,...
    99+
    2024-04-02
  • mongodb如何实现同库联表查询方法
    这篇文章主要介绍mongodb如何实现同库联表查询方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!注意:这里只对同库联表查询做介绍,跨库联表查询可能在之后也会介绍(因为公司架构变动...
    99+
    2024-04-02
  • oracle多表关联查询如何实现
    在Oracle数据库中,可以使用SQL语句实现多表关联查询。以下是一个示例: 假设有两个表:表A和表B,它们有一个共同的字段ID可以...
    99+
    2024-04-09
    oracle
  • mysql中如何实现多表联合查询操作
    这篇文章将为大家详细讲解有关mysql中如何实现多表联合查询操作,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。MySQL多表联合查询语法:复制代码 代码如下...
    99+
    2024-04-02
  • MyBatis-Plus实现多表联查
    MyBatis-Plus多表联查写法 前言一、引依赖二、使用方法三、(实战)多表查询参数说明 四、(实战)多表分页查询 前言 收获大佬封装的一个jar包,可以支持MyBatis-...
    99+
    2023-09-03
    mybatis java sql
  • 如何在MySQL中实现联表查询
    这篇文章将为大家详细讲解有关如何在MySQL中实现联表查询,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。MySQL 中 JOIN, CROSS JOIN 和...
    99+
    2024-04-02
  • MongoDB多表关联查询操作实例详解
    本文实例讲述了MongoDB多表关联查询操作。分享给大家供大家参考,具体如下: Mongoose的多表关联查询 首先,我们回忆一下,MySQL多表关联查询的语句: student表: calss表: 通...
    99+
    2024-04-02
  • MyBatis-Plus怎么实现多表联查
    这篇文章主要介绍“MyBatis-Plus怎么实现多表联查”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MyBatis-Plus怎么实现多表联查”文章能帮助大家解决问题。建库建表DROP&n...
    99+
    2023-06-29
  • MySQL多表联查的实现思路
    目录多表联查场景一对一多对一多对多内连接查询外连接自连接联合查询子查询多表联查场景 一对一 用户与用户信息表:当用户的信息数据过多时,我们可以将其分成两个表分别对应用户基本信息和用户的详情信息。 create table...
    99+
    2023-02-21
    MySQL多表联查有几种方法 MySQL多表联查语句
  • mybatis-plus多表联查join的实现
    目录1、安装依赖2、定义三个基本实体类3、定义三个mapper4、定义返回值dto5、开发业务层6、假如进行分页查询的话7、注意:8、其他9、如果针对条件进行动态查询1、安装依赖 &...
    99+
    2023-01-11
    mybatis-plus多表联查 mybatis-plus多表联查join
  • MongoDB中多表关联查询($lookup)的深入讲解
    一.  聚合框架 聚合框架是MongoDB的高级查询语言,它允许我们通过转换和合并多个文档中的数据来生成新的单个文档中不存在的信息。 聚合管道操作主要包含下面几个部分: ...
    99+
    2024-04-02
  • MyBatis如何实现多表联合查询resultType的返回值
    这篇“MyBatis如何实现多表联合查询resultType的返回值”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MyBat...
    99+
    2023-06-29
  • Hibernate多表关联查询怎么实现
    本篇内容介绍了“Hibernate多表关联查询怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、Hibernate简介Hiberna...
    99+
    2023-06-17
  • mongodb多层嵌套查询如何实现
    在MongoDB中,多层嵌套查询可以通过使用“点符号”来访问嵌套的字段。下面是一个示例,用于说明如何实现多层嵌套查询: 假设我们有一...
    99+
    2024-04-11
    mongodb
  • Mongodb实现的关联表查询功能【population方法】
    本文实例讲述了Mongodb实现的关联表查询功能。分享给大家供大家参考,具体如下: Population MongoDB是非关联数据库。但是有时候我们还是想引用其它的文档。这就是population的用武之...
    99+
    2024-04-02
  • MyBatis实现多表联查的详细代码
    目录一、通过映射配置文件实现多表联查二、使用注解的方式一、通过映射配置文件实现多表联查 首先,使用Mysql数据库,创建两个表,分别为学生表Student表和班级表Class表,在S...
    99+
    2022-11-13
    MyBatis多表联查 MyBatis多表查询
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作