我在 MongoDB 中有兩個集合,其中包含一些陣列和嵌套陣列,我想查找或考慮兩個外鍵的其他內容。
集合結構:
股票
{
merchantIds: ["abc"],
products: [
{
code: "123",
quantity: 10
},
{
code: "456",
quantity: 15
},
{
code: "999",
quantity: 99
}
]
}
命令
{
id: "123456789",
items: [
{
name: "aaa",
externalCode: "123",
quantity: 1,
options: [
{
name: "ccc",
externalCode: "999",
quantity: 2,
}
],
},
{
name: "bbb",
externalCode: "456",
quantity: 2,
options: [
name: "aaa",
externalCode: "123",
quantity: 5,
]
},
{
name: "ddd",
externalCode: "789",
quantity: 2,
options: []
}
]
}
我想在兩個集合之間創建一個聚合管道來獲得這個結果:
[
{
name: "aaa",
externalCode: "123"
},
{
name: "bbb",
externalCode: "456"
},
{
name: "ccc",
externalCode: "999"
}
]
我怎么能同時考慮items.externalCode和items.options.externalCode綜合管道并減少到這個結果?
uj5u.com熱心網友回復:
您可以在聚合管道中執行以下操作:
- 使用and展平
itemsand陣列items.options$map$reduce - 使用創建上述結果的聯合陣列
$setUnion $lookup到stocks收藏。在子管道中,指定您的加入條件$unwind修剪不匹配的結果
db.orders.aggregate([
{
"$match": {
id: "123456789"
}
},
{
"$project": {
items: {
"$map": {
"input": "$items",
"as": "i",
"in": {
name: "$$i.name",
externalCode: "$$i.externalCode"
}
}
},
options: {
"$reduce": {
"input": "$items",
"initialValue": [],
"in": {
"$concatArrays": [
"$$value",
{
"$reduce": {
"input": "$$this.options",
"initialValue": [],
"in": {
"$concatArrays": [
"$$value",
[
{
name: "$$this.name",
externalCode: "$$this.externalCode"
}
]
]
}
}
}
]
}
}
}
}
},
{
"$project": {
union: {
"$setUnion": [
"$items",
"$options"
]
}
}
},
{
"$unwind": "$union"
},
{
"$lookup": {
"from": "stocks",
let: {
extCode: "$union.externalCode"
},
pipeline: [
{
$match: {
merchantIds: "abc"
}
},
{
"$match": {
$expr: {
"$in": [
"$$extCode",
"$products.code"
]
}
}
}
],
"as": "lookupResult"
}
},
{
"$unwind": "$lookupResult"
},
{
$project: {
externalCode: "$union.externalCode",
name: "$union.name"
}
}
])
這是Mongo游樂場供您參考。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/444850.html
