加入多个集合 + docDB

问题描述

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

集合一

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

集合B

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

预期输出

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

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

 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 中运行良好。但是 DocDB as per AWS doc不支持 $let。那么如何在没有 $let 的情况下重写上述查询

尝试了以下方法

等等。但注意是有帮助的。

解决方法

下面列出的是获得您在 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" ] } 
}
])

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