问题描述
考虑我有集合 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" ] }
}
])
如果这对你有用,请分享。