sai*_*web 7 mongoose mongodb mongodb-query aggregation-framework graphlookup
我有以下数据集(类别):
[{
"_id": 1,
"name": "Root",
"parent": null
},
{
"_id": 2,
"name": "Sub - Level 1",
"parent": 1
}, {
"_id": 3,
"name": "Sub - Level 2",
"parent": 2
}, {
"_id": 4,
"name": "Sub - Level 3",
"parent": 3
}
]
Run Code Online (Sandbox Code Playgroud)
我正在该数据集上运行以下管道以递归方式获取树:
[{
'$match': {
'_id': 1
}
}, {
'$graphLookup': {
'from': 'categories',
'startWith': '$_id',
'connectFromField': '_id',
'connectToField': 'parent',
'as': 'menu'
}
}, {
'$sort': {
'menu.parent': 1
}
}]
Run Code Online (Sandbox Code Playgroud)
目的是像这样递归地获取树:
{
"_id": 1,
"name": "Root",
"parent: "null",
"menu": [
{..sub},{..sub},{...sub}
]
}
Run Code Online (Sandbox Code Playgroud)
它完成了这项工作,但每次执行查询时,数组中元素的顺序menu都不同。每次!
"menu" : [{... Sub - Level 2},{... Sub - Level 3}, {... Sub - Level 1}]
"menu" : [{... Sub - Level 1},{... Sub - Level 3}, {... Sub - Level 2}]
"menu" : [{... Sub - Level 3},{... Sub - Level 1}, {... Sub - Level 2}]
Run Code Online (Sandbox Code Playgroud)
这是正常行为$graphLookup还是我错过了什么?我应该如何对menu数组进行排序?
不保证as 字段中返回的文档按任何顺序排列。
https://docs.mongodb.com/manual/reference/operator/aggregation/graphLookup/#definition
如果您需要订单,请考虑指定“深度字段”参数,并按该参数进行排序。
https://jira.mongodb.org/browse/SERVER-26153
解决方法:
db.categories.aggregate([
{
"$match": {
"_id": 1
}
},
{
"$graphLookup": {
"from": "categories",
"startWith": "$_id",
"connectFromField": "_id",
"connectToField": "parent",
"as": "menu",
depthField: "order"
}
},
{
$unwind: "$menu"
},
{
$sort: {
_id: 1,
"menu.order": 1
}
},
{
$group: {
_id: "$_id",
name: {
$first: "$name"
},
parent: {
$first: "$parent"
},
menu: {
$push: "$menu"
}
}
},
{
$unset: "menu.order" //Change to $project:{"menu.order":0} for MongoDB <v4.2
}
])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2806 次 |
| 最近记录: |