首页 > 解决方案 > 加入多个集合 + docDB

问题描述

考虑我有集合 2 个集合,名为 a,b。

收集一个

{
"id":"123"
"key1":"fjf",
"key2":[{},{}]
}

集合B

{
"key1b":"fjf",
"id":"123",
"key2b":"bvbvb"
}

预期输出:

{
"id":"123"
"key1":"fjf",
"key2":[{},{}],
"joined":[{
    "key1b":"fjf",
    "id":"123",
    "key2b":"bvbvb"
}]
}

所以必须根据条件加入 2 个集合a.key1 == b.key1b&&a.id == b.id。所以我使用管道阶段如下:

 await a.aggregate([
   { "$match": { "x": "fdsfd" } },
  {
    "$lookup": {
      "from": "b",
    "let": { "Id": "$id" },
      "pipeline": [
       {
          "$match": {
            "$expr": {
               "$and": [
                { $eq: ["$id", "$$qId"] },
                 {
                  $eq: ["$key1b", "adsdsd"],
                 },
             ],
            },
           }
         }
       ],
       "as": "abc"
     }
   }
 ])

它在 mongoDb 中运行良好。但是根据 AWS doc,DocDB 不支持 $let 。那么如何在没有 $let的情况下重写上述查询呢?

尝试了以下方法:

等等。但注意有帮助。

标签: node.jsmongodbaws-documentdb

解决方案


下面列出的是另一种获取您在 DocumentDB 中寻找的结果的方法。它使用聚合管道和 $lookup 阶段,相当于左连接,然后删除由于左连接而可能具有空值的记录。请注意,如果“id”字段不是唯一的,则可能会返回重复项。此外,在使用聚合管道时,请先尝试使用 $match 来减少管道中正在处理的记录。请根据您的峰值量检查查询的性能,以确保最佳响应。

db.tableA.aggregate([
{
    $lookup:
        {
          from: "tableB",
          localField: "id",
          foreignField: "id",
          as: "joined"
        }
},  
{ $unwind :"$joined" },
{
  $redact: { $cond: [ { $eq: [ "$key1", "$joined.key1b" ] }, "$$KEEP", "$$PRUNE" ] } 
}
])

如果这对您有用,请分享。


推荐阅读