node.js - 加入多个集合 + 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的情况下重写上述查询呢?
尝试了以下方法:
等等。但注意有帮助。
解决方案
下面列出的是另一种获取您在 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" ] }
}
])
如果这对您有用,请分享。
推荐阅读
- android - 有什么方法可以在 Android Studio 布局编辑器中查看应用到操作栏的自定义布局?
- javascript - 2 个几乎相同的 Jquery 代码,但只有一个有效
- go - 如何通过google idToken获取userInfo
- angular - 如何以角度隐藏/显示素数ng表中的p列?
- arrays - 如何在 JSON 中使用带有字符串数组的模型?
- linux - 计算 5 分钟上限
- google-analytics - Datorama 和 Google Analytics 数据流 - 403:超出用户速率限制
- kubernetes - kuberntes 中的 nginx-ingress / 如何启用和使用 geoip?
- python - 根据日期对python列表进行排序?
- sprite-kit - 跟随 SpriteKit 的敌人加班时间越来越近