MongoDB聚合操作:用实际文档替换ObjectId数组

3

假设我们有这个db.orders文档集合,其中包含一个文档:

{"_id": "5ef62e0c586c78491530e4d5", "items": [{ "description": "desc1", "parts": ["5ef62e0c586c78491530e4d7", "5ef62e0c586c78491530e4d8"] } ], "createdBy": "userId"}

[更正:现在items字段是一个数组]

还有一个db.parts集合,其中包含两个零件文档:

{"_id": "5ef62e0c586c78491530e4d7", "name": "part1" }
{"_id": "5ef62e0c586c78491530e4d8", "name": "part2" }

我想在第一个集合上建立聚合,将部件数组中的ObjectIds替换为实际文档。结果应该如下所示:
{"_id": "5ef62e0c586c78491530e4d5", "items": [{ "description": "desc1", "parts":
  [
    {"_id": "5ef62e0c586c78491530e4d7", "name": "part1" },
    {"_id": "5ef62e0c586c78491530e4d8", "name": "part2" }
  ]
}], "createdBy": "userId"}

非常感谢您的建议!

1个回答

1
你需要使用$lookup运算符:
db.orders.aggregate([
  {
    $lookup: {
      from: "parts",
      localField: "items.parts",
      foreignField: "_id",
      as: "parts"
    }
  },
  {
    $project: {
      createdBy: 1,
      items: {
        $map: {
          input: "$items",
          as: "item",
          in: {
            description: "$$item.description",
            parts: {
              $filter: {
                input: "$parts",
                as: "part",
                cond: {
                  $in: [ "$$part._id", "$$item.parts" ]
                }
              }
            }
          }
        }
      }
    }
  }
])

MongoPlayground

{{链接1:MongoPlayground}}


谢谢!我在问题中实际上犯了一个错误。“items”字段应该是一个数组,如下所示:{"_id": "5ef62e0c586c78491530e4d5", "items": [{ "description": "desc1", "parts": ["5ef62e0c586c78491530e4d7", 5ef62e0c586c78491530e4d8] }], "createdBy": "userId"} 在执行查找时,它没有将“items”保留为数组,并且我失去了“description”字段。 - Thomas Skyttegaard Hansen
1
@ThomasSkyttegaardHansen 请再次检查,我已经更新了我的答案。 - Valijon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接