在這里,我有三個集合。
類別
category: [
{
id: 1,
name: "cat 1",
status:true
},
{
id: 2,
name: "cat 2",
status:true
}
]
物品
item: [
{
id: 1,
name: "item 1"
},
{
id: 2,
name: "item 2"
},
{
id: 3,
name: "item 3"
},
{
id: 4,
name: "item 4"
}
]
包裹
[
{
id: 1,
name: "package 1",
categoryId: 1,
items: [
{
_id: 1,
itemId: 1
},
{
_id: 2,
itemId: 2
}
]
},
{
id: 2,
name: "package 2",
categoryId: 2,
items: [
{
_id: 1,
itemId: 3
},
{
_id: 2,
itemId: 4
}
]
}
]
我想在類別上packages一直保持一致items object,并且每個類別的狀態都應該是真實的。我想根據類別列出所有包。
集合包的列CategoryId為外鍵。
集合包的ItemId列是外鍵。
預期輸出
[
{
name:'cat 1',
status:true,
package:[
{
id: 1,
name: "package 1",
categoryId: 1,
items: [
{
id: 1,
name: "item 1"
},
{
id: 2,
name: "item 2"
},
]
}
]
},
{
name:'cat 2',
status:true,
package:[
{
id: 2,
name: "package 2",
categoryId: 2,
items: [
{
id: 3,
name: "item 3"
},
{
id: 4,
name: "item 4"
},
]
}
]
}
]
供參考:https : //mongoplayground.net/p/83z0Hcgh04i
uj5u.com熱心網友回復:
為了達到預期的結果,我們必須對資料執行一些步驟,我們將解釋每個步驟。您可以在此處查看完整查詢。
我們必須在categoryDB 上使用的操作是aggregation
db.category.aggregate([])
在這個函式中,我們將把每一步都放在陣列中。第一個是 a lookup,我們將獲取與每個類別匹配的包并將它們存盤在packages欄位中
{
"$lookup": {
"from": "package",
"localField": "id",
"foreignField": "categoryId",
"as": "packages"
}
}
由于我們需要物品資訊來填充每個物品并且物品在每個包內,因此我們必須將它們分開。我們將unwind包裹和物品。
{
"$unwind": "$packages"
},
{
"$unwind": "$packages.items"
}
現在我們可以將每個專案與他的資訊進行匹配,lookup并將它們存盤在每個包中。
{
"$lookup": {
"from": "items",
"localField": "packages.items.itemId",
"foreignField": "id",
"as": "packages.items"
}
}
因為做一個lookup給我們一個陣列,我們將使用另一個unwind來確保在摸索之前每個檔案只有一個專案。
{
"$unwind": "$packages.items"
}
此時我們擁有了我們想要的所有日期,但我們必須再次對其進行分組,因為我們之前用unwind. 為了執行此操作,我們將group在packages.id. 我們將格式化我們想要的欄位,將所有專案放在一起并在root欄位中保存一些輔助資料以備后用。
{
"$group": {
"_id": "$packages.id",
name: {
"$first": "$packages.name"
},
"brandId": {
"$first": "$packages.brandId"
},
"categoryId": {
"$first": "$packages.categoryId"
},
root: {
"$first": "$$ROOT"
},
"items": {
"$push": "$packages.items"
}
}
}
在這一步我們將所有的包放在一起,我們必須group獲得category. 為此,我們將使用root.
{
"$group": {
"_id": "$root.id",
name: {
"$first": "$root.name"
},
"packages": {
"$push": "$$ROOT"
}
}
}
最后,我們將擦除輔助root欄位。
{
"$project": {
"packages.root": 0
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/365115.html
標籤:MongoDB 猫鼬 mongodb-查询 节点
