$lookup 数组中的 ObjectId

2023-11-21

在 ObjectId 数组而不仅仅是单个 ObjectId 字段上执行 $lookup 的语法是什么?

订单文档示例:

{
  _id: ObjectId("..."),
  products: [
    ObjectId("..<Car ObjectId>.."),
    ObjectId("..<Bike ObjectId>..")
  ]
}

不工作查询:

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

期望的结果

{
  _id: ObjectId("..."),
  products: [
    ObjectId("..<Car ObjectId>.."),
    ObjectId("..<Bike ObjectId>..")
  ],
  productObjects: [
    {<Car Object>},
    {<Bike Object>}
  ],
}

2017年更新

$lookup 现在可以直接使用数组作为本地字段. $unwind不再需要。

旧答案

The $lookup聚合管道阶段不能直接与数组一起工作。设计的主要目的是将“左连接”作为可能的相关数据的“一对多”类型的连接(或者实际上是“查找”)。但该值应该是单数而不是数组。

因此,在执行之前,您必须先对内容进行“去规范化”$lookup操作才能使其发挥作用。这意味着使用$unwind:

db.orders.aggregate([
    // Unwind the source
    { "$unwind": "$products" },
    // Do the lookup matching
    { "$lookup": {
       "from": "products",
       "localField": "products",
       "foreignField": "_id",
       "as": "productObjects"
    }},
    // Unwind the result arrays ( likely one or none )
    { "$unwind": "$productObjects" },
    // Group back to arrays
    { "$group": {
        "_id": "$_id",
        "products": { "$push": "$products" },
        "productObjects": { "$push": "$productObjects" }
    }}
])

After $lookup匹配每个数组成员,结果是一个数组本身,所以你$unwind再次和$group to $push最终结果的新数组。

请注意,任何未找到的“左连接”匹配都将为给定产品上的“productObjects”创建一个空数组,从而在第二个匹配时否定“product”元素的文档。$unwind叫做。

虽然直接应用于数组会很好,但目前的工作方式只是将一个奇异值与可能的多个值进行匹配。

As $lookup基本上是非常新的,目前它的工作原理对于那些熟悉的人来说是熟悉的mongoose作为“穷人版”.populate()那里提供的方法。区别在于$lookup提供“连接”的“服务器端”处理,而不是在客户端上,并且其中的一些“成熟度”$lookup目前还缺少什么.populate()提供(例如直接在数组上插入查找)。

这实际上是一个需要改进的分配问题服务器-22881,所以如果幸运的话,这将在下一个版本或不久之后发布。

作为设计原则,您当前的结构既不好也不坏,只是在创建任何“连接”时受到开销。因此,MongoDB 一开始的基本原则就适用,如果您“可以”接受在一个集合中“预连接”的数据,那么最好这样做。

另一件可以说的事$lookup作为一般原则,此处“连接”的目的是按与此处所示相反的方式工作。因此,最好的一般原则是“相关文档”包含对“父”文档的引用,而不是将其他文档的“相关 ID”保留在“父”文档中。

So $lookup可以说通过“关系设计”“工作得最好”,这与猫鼬这样的东西相反.populate()执行它的客户端连接。通过识别每个“许多”中的“一个”,然后您只需拉入相关项目,而无需$unwind首先是数组。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

$lookup 数组中的 ObjectId 的相关文章

  • MongoDB 更新。尝试从一个字段的属性设置另一个字段

    我想做的事情非常简单 但我不知道如何为一个字段赋予另一个字段的值 我只想用另一个字段的字符数更新一个字段 db collection update exists true set field1 field2 length 我试过给它点符号
  • java.lang.IllegalArgumentException:在 MongoDB 中执行聚合的引用无效

    我收集了一份文件 id ObjectId 5ab273ed31fa764560a912f8 hourNumber 21 errorSegments agentName agentX agentName agentY 我正在尝试在 Sprin
  • Spring Data - MongoDB 索引 DBRef

    我正在使用 spring data mongodb 1 2 0 RELEASE 我有两个类 A 和 B 其中 B 引用了 A 并且用 DBRef 进行了注释 Class A Document collection a public clas
  • 为什么 Casbah / Java MongoDB 驱动程序最终会出现 java.lang.IllegalArgumentException?

    我使用时看到一个奇怪的问题casbah java driver 当驱动程序尝试从 mongo 创建响应时 我不断遇到以下异常 Oct 16 2012 10 45 07 AM com mongodb DBTCPConnector MyPort
  • 从 mongo shell 查找 mongoDB 上 2 个文档之间的差异

    我正在使用 mongodb 2 4 4 我想比较 2 个文档 然后仅使用 mongo shell 打印它们的差异 有没有办法比较它们 就像是 db collection compare first doc objectID blablalb
  • Mongoose:转换为 ObjectId 失败

    我正在尝试在 MongoDB 中创建一个类别层次结构 以便通过 Mongoose 与 Node js 一起使用 我正在使用祖先数组方法 http docs mongodb org manual tutorial model tree str
  • 将位置数据存储在 Mongodb 文档中

    在我当前的项目中 我将位置数据以以下格式存储在 Mongodb 文档中 location loc lng 118 15592692 lat 34 03566804 geocode city East Los Angeles state CA
  • 在 mongodb 中更新异步重复数据的最佳实践

    我正在权衡 Web 应用程序从关系 SQL 数据库迁移到 mongodb 的利弊 这是为了解决性能问题 将所有对象依赖项存储在对象本身中允许快速 读 用于向用户显示数据 另一方面 某些数据存在于不同的集合中 例如用户名位于用户集合中 但也在
  • 在 config.js 中打开 admin 以查看服务器统计信息

    拉动后运行此命令 docker run d p 27017 27017 e MONGO INITDB ROOT USERNAME admin e MONGO INITDB ROOT PASSWORD password name mongod
  • mongo docker 镜像创建后未运行脚本

    我使用 docker compose 为前端 后端和 mongo 实例创建 3 个不同的容器 其中三个正在运行并在它们之间连接 但我需要在 mongo 实例运行后立即在数据库上创建一个管理员用户 根据 mongo 图像文档 每个脚本位于do
  • Mongoose查询结果是只读的吗?

    如何修改 Mongoose 查询返回的对象 假设我们有以下模式 var S new mongoose Schema name String field String 我对结果进行了以下查询和修改 var retrieve function
  • mongodb 更新所有文档,并将值增加 1 [重复]

    这个问题在这里已经有答案了 我在 mongoDB 中有几个文档 文档结构是这样的 a abc myid 2 我想用 1 更新所有文档的 myid 例如 第一个文档 myid 1 第二个文档 myid 2 依此类推 有询问吗 尝试这个查询 d
  • 多文档事务在使用 mongodb 4.08 社区服务器的 C# 中不起作用

    我需要使用 mongodb 事务更新多个文档 mongodb 社区服务器版本是 4 08 net 的 mongodb 驱动程序是 2 9 beta 也尝试过 2 8 从调试中 我可以看到它执行了 session AbortTransacti
  • 如何在java中创建mongoDB objectid

    参考帖子如何使用 Java 将数组添加到 MongoDB 文档 https stackoverflow com questions 15371839 how to add an array to a mongodb document usi
  • Flask 不加载配置

    我在 Flask 中加载配置时遇到问题 from config import config DevelopmentConfig TestingConfig ProductionConfig def create app config nam
  • 将 Django +1.10 与 MongoDB 连接

    在过去的几个月里 有人为 MongoDB 更换了 Django 1 10 中的默认数据库引擎吗 我在谷歌上得到的所有信息都是六四年前的 最常见的结果包括mongodb 引擎这需要Django nonrel 来自 Django 1 5 的一个
  • MongoDB 中两个集合之间的 Diff()

    我做过研究 如果这是一个重复的问题 我很抱歉 但其他问题的解决方案并不适合我 因此 我提出了一个新问题 使用 Javascript 比较两个集合的最佳方法是什么 我有数千个这样的 Mongo 文档格式的标头 url google com h
  • MongoDB insertMany 并跳过重复项

    我试图insertMany https docs mongodb com manual reference method db collection insertMany 项目进入我的 Mongo 数据库 但我想跳过重复的 ID 我在用着N
  • $unwind聚合框架中的对象

    在 MongoDB 聚合框架中 我希望在对象 即 JSON 集合 上使用 unwind 运算符 看起来不像是这样possible http docs mongodb org manual reference aggregation S un
  • 国外收藏的查找和排序

    所以我有一个收藏users 并且此集合中的每个文档以及其他属性都有另一个集合中文档的 id 数组 workouts 集合中的每个文档workouts有一个名为date 这就是我想要得到的 对于特定用户 我想要获取属于该用户的锻炼的 work

随机推荐