考虑我有两个名为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"
}]
}
因此必须根据条件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文档,DocDB中不支持$let。那么,如果没有$let,我如何将查询重写为上面的查询?
尝试了以下操作:
- AWS DocumentDB是否支持在单个查询中加入3+集合
- $lookup结果中的$match
等。但注意会有所帮助。
下面列出的是在DocumentDB中获取结果的另一种方法。它使用聚合管道和$lookup阶段,后者相当于左联接,然后删除由于左联接而可能具有null值的记录。请注意,如果";id";字段不是唯一的,这可能会返回重复项。此外,在使用聚合管道时,请先尝试使用$match,以减少管道中正在处理的记录。请对照您的峰值容量检查查询的性能,以确保最佳响应。
db.tableA.aggregate([
{
$lookup:
{
from: "tableB",
localField: "id",
foreignField: "id",
as: "joined"
}
},
{ $unwind :"$joined" },
{
$redact: { $cond: [ { $eq: [ "$key1", "$joined.key1b" ] }, "$$KEEP", "$$PRUNE" ] }
}
])
如果这对你有用,一定要分享。