首页 > 解决方案 > MongoDB 3.6 - 如何使用 $lookup 修改此聚合查询,使其可以在多个文档上运行?

问题描述

我有 2 个集合,我想使用运算符对它们进行连接$lookup。我想加入的字段有不同的类型。$toObjectId由于升级数据库的挑战,我不能使用Operator,也不能修改现有数据。

处方集合

{"_id" : ObjectId("p1"), "currentOrderId" : "o1"}
{"_id" : ObjectId("p2"), "currentOrderId" : "o2"}
{"_id" : ObjectId("p3"), "currentOrderId" : "o3"}
{"_id" : ObjectId("p4"), "currentOrderId" : "o4"} ...

订单收集

{"_id" : ObjectId("o1"), "orderNumber": "123"}
{"_id" : ObjectId("o2"), "orderNumber": "123"}
{"_id" : ObjectId("o3"), "orderNumber": "123"}
{"_id" : ObjectId("o4"), "orderNumber": "123"} ...

我必须将订单文件加入处方文件,所以我的结果集合看起来像这样:

{"_id" : ObjectId("p1"), 
"currentOrderId" : "o1",
"currentOrder": {
       "_id" : ObjectId("o1"),
       "orderNumber": "123"
 }

......(更多文件)......

我只能使用以下查询加入一对处方和订单文件:

db.prescription.aggregate([
  { $match: {"_id":ObjectId("p1")}},
  { $addFields: { "coid": ObjectId("o1")}},
  { $lookup: {
    from: "order",
    localField: "coid",
    foreignField: "_id",
    as: "currentOrder"
  }},
  {
    $unwind: "$currentOrder",
  },
])

注意我硬编码了$matchand$addfields来测试我的查询。现在我想应用此查询,以便能够将所有订单批量加入处方集合。

这是我的想法:

  1. 我们不知道有多少处方,也不知道他们的_id's,因此我们需要运行一个查询来获取他们的_ids。并将其存储在列表中。

  2. 我需要批量应用这个查询,所以我可能会删除匹配运算符。

  3. 我还需要获取订单列表_id's,我可以对处方集合运行另一个查询,以获取订单 ID 的字符串列表。

  4. 我需要以某种方式将第 3 步中的字符串列表批量转换为 objectID。

抱歉,我现在只有这些。只要查询的数量不变,我会考虑涉及更多查询的答案。请注意,我不能使用 3.6 版之后引入的任何运算符。

非常感谢任何帮助或提示。

标签: mongodbjoinaggregatelookup

解决方案


推荐阅读