【问题、AI解答】mongodb中使用$lookup进行连表查询使用_id作为localField出现查询结果字段为空的情况

news2024/11/28 17:51:27

描述:

db.acticles.aggregate([
{
	$lookup:
	{
	from:"acticlesMaptags",
	localField:"_id",
	foreignField:"acticleid",
	as:"tagid"
	}
}
])

acticlesMaptags集合中的acticleid字段存在与acticles集合中的_id相匹配的数据,但是查询出来的tagid却为空。
在这里插入图片描述

下面是acticles集合与acticlesMaptags集合:

{
  "RECORDS": [
    {
      "_id": "6436ba99e0180000d2007562",
      "title": "这是标题",
      "text": "这是内容",
      "descripe": "接上期,MongoDB 的事务操作已经操作了,但细节和参数并没有弄清楚,通过mongodb 的事务操作主要分为以下几个部分1 Session.startTransaction2 ...",
      "time": "1681308703868"
    },
    {
      "_id": "6436ba9de0180000d2007563",
      "title": "这是标题",
      "text": "这是内容",
      "descripe": "事务是数据库中处理的逻辑单元,包括一个或多个数据库操作,既可以是读操作,也可以是写...要使用事务,你所部署的 MongoDB 必须是 MongoDB 4.2 或更高版本,MongoDB 的驱动程序必须更新为 MongoDB 4.2 或更高版本。...",
      "time": "1681308703868"
    },
    {
      "_id": "6436c0dce0180000d200756c",
      "title": "测试标题",
      "text": "这是内容",
      "descripe": "的哦奥球",
      "time": "1681308703868"
    }
  ]
}
{
  "RECORDS": [
    {
      "_id": "6436bfb9e0180000d200756a",
      "acticleid": "6436ba99e0180000d2007562",
      "tagid": "6436be71e0180000d2007565"
    },
    {
      "_id": "6436bff2e0180000d200756b",
      "acticleid": "6436ba9de0180000d2007563",
      "tagid": "6436bebae0180000d2007569"
    },
    {
      "_id": "6436c316e0180000d200756d",
      "acticleid": "6436c0dce0180000d200756c",
      "tagid": "6436be97e0180000d2007567"
    },
    {
      "_id": "6436c38ce0180000d200756e",
      "acticleid": "6436c0dce0180000d200756c",
      "tagid": "6436be97e0180000d2007567"
    },
    {
      "_id": "6438b4b0fe580000ec007ff2",
      "acticleid": "6436ba9de0180000d2007563",
      "tagid": "6436be97e0180000d2007567"
    }
  ]
}

ai的回答:

根据您提供的文档,从逻辑上看 $lookup 查询语句是正确的,但是结果为空可能有以下几个可能性:

acticlesMaptags 集合中的 acticleid 字段中的值与 acticles 集合中的 _id 字段值不完全匹配。请注意确保两个集合之间使用相同类型的字段进行关联(例如,都使用 ObjectID 类型)。
如果您在执行 $lookup 查询时未指定相关的查询条件,则将从 acticlesMaptags 集合中检索所有与 acticles 集合中的文档匹配的记录,这可能会返回大量数据并导致查询超时或者无法查询出结果。 基于您的数据,这种情况似乎不太可能发生。
另外一个可能性是访问权限问题。请确保您有足够的权限访问 acticlesMaptags 集合。
我们建议你通过对 acticlesMaptags 进行简单的聚合查询来验证集合中是否存在与 acticles 集合中的 _id 字段匹配的文档。例如,可以执行以下查询:

db.acticlesMaptags.aggregate([
  {
    $match: {
      acticleid: {
        $in: db.acticles.distinct("_id")
      }
    },
  }
])

此查询将返回 acticlesMaptags 集合中与 acticles 集合中的 _id 字段匹配的文档。如果没有返回结果,则可能存在相关性或访问权限问题,您需要进一步进行排查。

解决

根据ai的回答我可以判断是类型不相同出现的问题,于是我还问了下ai的解决方案:
在MongoDB中,使用lookup可以实现表连接的操作。
lookup可以实现表连接的操作。lookup运算符可以将文档从一个集合连接到另一个集合,并将结果作为新的嵌入式文档数组返回。

如果要连接两个不同类型的字段(例如ObjectId和字符串),可以使用以下方式:

假设有两个集合:orders和customers。orders集合中包含一个名为customerId的ObjectId字段,而customers集合中包含一个名为_id的字符串字段。要在orders集合中查找所有订单,以及与之相关联的客户信息,请执行以下步骤:

db.orders.aggregate([
  {
    $lookup: {
      from: "customers",
      localField: "customerId",
      foreignField: "_id",
      as: "customer_info"
    }
  }
])

上述代码将在orders集合中查找所有订单,并将customer_info字段添加到每个订单文档中。该字段是一个由查询customers集合得到的包含客户信息的数组。其中localField指定了在orders集合中用于匹配的字段,而foreignField指定了在customers集合中用于匹配的字段。

需要注意的一点是,如果要连接的两个字段类型不同,则需要将localField字段的值写成一个对象,其中包含了类似 $toString 和 $toObjectId 等转换方法。例如,如果orders集合的customerId字段是一个字符串而非ObjectId,则可采用如下方式进行转换:

db.orders.aggregate([
  {
    $lookup: {
      from: "customers",
      localField: { $toObjectId: "$customerId" },
      foreignField: "_id",
      as: "customer_info"
    }
  }
])

上述代码将使用$toObjectId运算符将customerId字段从字符串转换为ObjectId。然后,它将在customers集合中查找与之匹配的文档,并将结果包含在customer_info字段中。

最终我的解决方案

添加一个转换为string类型的_id字段。

db.acticles.aggregate([
  {
    $addFields: {
      acticleid: { $toString: "$_id" }
    }
  },
{
	$lookup:
	{
		from:"acticlesMaptags",
		localField:"acticleid",
		foreignField:"acticleid",
		as:"tagid"
	}
}
])

成功!!!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/423186.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1.15 从0开始学习Unity游戏开发--游戏UI

上一章中,我们剩下最后一个任务,需要支持鼠标控制准心来进行设计,那么准心本质上就是一个始终呈现在屏幕上的一个图片,你当然可以用一个3D物体来制作,之前讲解渲染概念的时候也提到过,我们的屏幕就是相机的…

传智健康_day3

本章对检查组管理进行开发 一.新增检查组 1.修改新增弹层可见属性&#xff0c;添加重置表单功能 2.动态刷新检查组包含的检查项信息 <tr v-for"c in tableData"> 使用for循环来遍历查询出tableData中的数据 tableData是一个数组对象&#xff0c;定义在VUE…

hadoop分布式安装

文章目录1. 将安装包hadoop-3.1.3.tar.gz上次至linux中2. 进行解压操作3. 修改目录名称4. 配置环境变量5. 远程传输5.1 scp远程传输6. 免密登录7. 集群规划8. 修改自定义配置文件8.1 hadoop-env.sh8.2 core-site.xml8.3 hdfs-site.xml8.4 mapred-site.xml8.5 yarn-site.xml8.6 …

ReactNative入门

React基本用法&#xff1a; react与js不同的点在于 react使用的是虚拟DOM js是真实DOM 作用&#xff1a;当有新的数据填充 可以复用之前的&#xff0c;而js需要整体重新渲染 创建虚拟DOM还可以使用jsx语法直接声明&#xff1a; 注意要用babel标签将jsx转化为js 但是建议采用j…

UNIX环境高级编程——进程环境

7.1 引言 本章主要讲解了进程的环境。 7.2 main函数 C程序总是从main函数开始执行&#xff0c;其函数原型为&#xff1a; int main(int argc, char *argv[]);argc是命令行参数的数目&#xff0c;argv是指向参数的各个指针所构成的数组&#xff1b;当内核执行C程序时&#x…

SpringBoot集成Kafka详解

一、使用idea创建SpringBoot项目 1.1 使用Spring Initializr创建一个SpringBoot程序 点击Next。 1.2 添加依赖 依赖说明&#xff1a; Lombok简化实体类开发。 Spring Web让项目集成web开发所有依赖&#xff0c;包括Spring MVC&#xff0c;内置tomcat等。 Spring for Apache…

HNU-操作系统OS-2023期中考试复习-刷题

往年期中卷极难获得&#xff0c;这里找了几套卷子。可以看看。 因为往年都是从第一周开始上课的&#xff0c;所以进度会快一点&#xff0c;这学期是从第四周开始上课的&#xff0c;所以进程会慢些&#xff0c;讲到第九章所以只考到第九章。 同样因为太忙了&#xff0c;答案找…

图像分类卷积神经网络模型综述

图像分类卷积神经网络模型综述遇到问题 图像分类&#xff1a;核心任务是从给定的分类集合中给图像分配一个标签任务。 输入&#xff1a;图片 输出&#xff1a;类别。 数据集MNIST数据集 MNIST数据集是用来识别手写数字&#xff0c;由0~9共10类别组成。 从MNIST数据集的SD-1和…

ctfshow web入门web119-124

1.web119 和118题类似&#xff0c;只不过是过滤了PATH 0可以用任何字符代替&#xff0c;比如A,{A},A,{0} KaTeX parse error: Expected }, got # at position 2: {#̲SHLVL}1&#xff0c;或者{##},${#?} {PHP_VERSION:~A}2,php版本为x.x.2时 ${#IFS}3(linux下是3&#xff0c;…

IntelliJ IDEA 2023.1正式发布,Maven项目大提速支持Apache Dubbo

你好&#xff0c;我是YourBatman&#xff1a;做爱做之事❣交配交之人。 &#x1f4da;前言 一年一个大版本&#xff0c;共计3个中型版本&#xff0c;北京时间2023年3月月29日终于迎来了IntelliJ IDEA今年的首个版本2023.1。老规矩&#xff0c;吃肉之前&#xff0c;可以先把这…

顺丰科技x腾讯安全iOA联合案例获云安全联盟CSA 2022安全革新奖

近年来&#xff0c;随着云计算、大数据、物联网等技术的加速创新和应用&#xff0c;一场数字化的变革开始席卷各行各业。远程办公、业务协同、分支互联等需求涌现&#xff0c;随之而来的还有更加复杂多元的高级网络攻击。在此背景下&#xff0c;传统的基于边界的网络安全防护理…

矩阵键盘+CH559制作国产USB矩阵键盘

矩阵键盘+CH559制作国产USB矩阵键盘 文章目录 矩阵键盘+CH559制作国产USB矩阵键盘为什么选择CH559作为主控芯片?如何实现该款矩阵USB键盘?如何将矩阵键盘的信号转化为USB键盘信号?原材料: 矩阵键盘(附带行列键码定义)CH559开发板将矩阵键盘的所有排线连接到单片机的GPIO引…

基于stm32mp157 linux开发板ARM裸机开发教程5:ARM微处理器指令系统(连载中)

前言&#xff1a; 目前针对ARM Cortex-A7裸机开发文档及视频进行了二次升级持续更新中&#xff0c;使其内容更加丰富&#xff0c;讲解更加细致&#xff0c;全文所使用的开发平台均为华清远见FS-MP1A开发板&#xff08;STM32MP157开发板&#xff09; 针对对FS-MP1A开发板&…

Python | Python的自我介绍(前世今生)

本文概要 本篇文章主要介绍Python这门语言的前世今生&#xff0c;适合刚入门的小白或者想了解Python历史的同学&#xff0c;文中描述很详细&#xff0c;具有一定的学习价值&#xff0c;感兴趣的小伙伴快来一起学习吧。 个人简介 ☀️大家好&#xff01;我是新人小白博主朦胧的…

【机器学习】样本不均衡(class-imbalance)——解决方案与问题思考

目录问题提出问题重述与再理解第一个问题&#xff1a;假如样本不均衡&#xff0c;哪种分类器的泛化性能较好&#xff1f;第二个问腿&#xff1a;在样本不均衡的情况下&#xff0c;如何获得更健壮的模型问题解决方法样本不均衡对机器学习模型会造成什么影响什么模型适合样本不均…

小黑今天上午着急忙慌实习公司楼下笔试,晚上准备和尚香疯狂星期四明天继续现场笔试的leetcode之旅:1091. 二进制矩阵中的最短路径

小黑代码1 class Solution:def shortestPathBinaryMatrix(self, grid: List[List[int]]) -> int:# 一定无解的情况if grid[0][0] 1 or grid[-1][-1] 1:return -1# 矩阵长度n len(grid)# 起点即终点if n 1:return 1# 访问集合seen {(0, 0)}# 初始化队列q collections.…

射频功率放大器在空气耦合超声检测系统中的应用

实验名称&#xff1a;空气耦合超声检测系统研究方向&#xff1a;超声测试设备&#xff1a;ATA-8202射频功率放大器、探头、ATA-5620前置放大器、超声波接收器、数据采集卡、计算机。实验过程&#xff1a;图&#xff1a;空气耦合超声检测锂电池系统锂电池空气耦合超声检测具体过…

TryHackMe-Year of the Dog(Linux渗透测试)

Year of the Dog 谁知道呢&#xff1f;狗咬了一口&#xff01; 端口扫描 循例nmap Web枚举 进80 用gobuster扫了一圈没有任何发现&#xff0c;图像也没有隐写 在主页的请求头的cookie有一个id 改成其他错误值会导致异常&#xff0c;看见叫id&#xff0c;习惯性加个了引号 爆…

【java】集合类

文章目录集合根接口LIST列表迭代器Queue|Deque|PriorityQueueSet集合HashSetLinkedHashSetTreeSet键盘读入MapHashMapLinkedHashMapStream流stream()ints()Collections工具类集合根接口 所有的集合类最终都是实现自集合根接口的&#xff0c;比如ArrayList类&#xff0c;它的祖先…

走向国际市场,怎样用Facebook广告抢占商机?

在当今全球化的商业世界中&#xff0c;企业要想在国际市场中占据一席之地&#xff0c;除了打造优质产品和服务外&#xff0c;有效的营销手段也是至关重要的。 而Facebook作为全球最大的社交媒体平台&#xff0c;其广告投放服务为企业提供了一个快速、便捷、有效的推广途径。那…