[英]mongodb - aggregation with $match $in with a $lookup pipeline
如果我有以下對象作為obj
:
{
"abc1": "xyz1",
"abc2": "xyz2",
"abc3": "xyz3"
}
我想用以下內容進行聚合:
db.collection.aggregate([
{
"$match": {
"_id": {
$in:
Object.keys(obj)
}
}
},
{
"$lookup": {
"from": "subdocument",
"pipeline": [
{
"$match": {
"_id": ObjectId(matching_value)
}
},
],
"as": "subdocument"
}
},
{ "$unwind": "$subdocument" }
])
如何讓$lookup
管道匹配對象鍵以匹配對象值? 是否可以?
所以這將是一個單一的數據庫調用版本:
let obj = {
"abc1": "xyz1",
"abc2": "xyz2",
"abc3": "xyz3"
}
for (let key in obj)
{
db.collection.aggregate([
{
"$match": {
"_id":
ObjectId(key)
}
},
{
"$lookup": {
"from": "subdocument",
"pipeline": [
{
"$match": {
"_id": ObjectId(obj[key])
}
},
],
"as": "subdocument"
}
},
{ "$unwind": "$subdocument" }
])
}
示例集合
db.maindocuments
[
{
_id: "abc1",
data: "data"
},
{
_id: "abc2",
data: "data"
},
{
_id: "abc3",
data: "data"
}
]
db.subdocuments
[
{
_id: "xyz1",
data: "data"
},
{
_id: "xyz2",
data: "data"
},
{
_id: "xyz3",
data: "data"
}
]
好吧,我可以看到這兩個集合中沒有關系。 這就是$lookup
不起作用的原因,因為文檔中沒有匹配的鍵。
因此,您可以使用async
await
const obj = {
"abc1": "xyz1",
"abc2": "xyz2",
"abc3": "xyz3"
}
for (let key in obj) {
const data = await db.collection.findOne({ _id: key })
const subdocument = await db.subdocument.findOne({ _id: obj[key] })
data.subdocument = subdocument
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.