假設我有這個資料集:
[
{
_id: '1',
name: 'test1',
children: ['test2', so on...],
status: 'enabled',
version: 1,
},
{
_id: '2',
name: 'test2',
children: [],
status: 'enabled',
version: 1,
},
{
_id: '3',
name: 'test2',
children: ['test3'],
status: 'enabled',
version: 2,
},
{
_id: '4',
name: 'test2',
children: [],
status: 'disabled',
version: 3,
},
{
_id: '5',
name: 'test3',
children: [],
status: 'enabled',
version: 1,
}
]
我需要做的是獲取_id=1專案的孩子并回傳啟用的孩子和最高版本。
有沒有辦法讓我通過聚合階段清楚地做到這一點,還是我必須通過代碼手動完成?
我擁有的當前聚合查詢:
db.Collection.aggregate([
{
$match: { name: 'test1', status: 'enabled' }
},
{
$graphLookup: {
from: "Collection",
startWith: "$children",
connectFromField: "children",
connectToField: "name",
as: "spreadChildren",
restrictSearchWithMatch: {
status: 'enabled'
}
}
}
])
這是預期的結果:
[
{
name: 'test1',
children: ['test2'],
status: 'enabled',
version: 1,
spreadChildren: [
{
_id: '3',
name: 'test2',
children: [],
status: 'enabled',
version: 2,
},
]
}
]
uj5u.com熱心網友回復:
您可以在聚合管道中執行以下操作:
$unwind結果$graphLookup。$sort經過version$group在spreadChildren.name水平和堅持所有領域;用于$first保留最大version元素$group再次在_id水平上恢復到預期的輸出
db.collection.aggregate([
{
$match: {
name: "test1",
status: "enabled"
}
},
{
$graphLookup: {
from: "collection",
startWith: "$children",
connectFromField: "children",
connectToField: "name",
as: "spreadChildren",
restrictSearchWithMatch: {
status: "enabled"
}
}
},
{
"$unwind": "$spreadChildren"
},
{
$sort: {
"spreadChildren.version": -1
}
},
{
$group: {
_id: {
_id: "$_id",
name: "$spreadChildren.name"
},
children: {
$first: "$children"
},
name: {
$first: "$name"
},
spreadChildren: {
$first: "$spreadChildren"
},
status: {
$first: "$status"
},
version: {
$first: "$version"
}
}
},
{
$group: {
_id: "$_id._id",
children: {
$first: "$children"
},
name: {
$first: "$name"
},
spreadChildren: {
$push: "$spreadChildren"
},
status: {
$first: "$status"
},
version: {
$first: "$version"
}
}
}
])
這是Mongo playround供您參考。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/477726.html
