我有以下数据集(类别):
[{
"_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
}
]我正在这个数据集上运行以下管道来递归地获取树:
[{
'$match': {
'_id': 1
}
}, {
'$graphLookup': {
'from': 'categories',
'startWith': '$_id',
'connectFromField': '_id',
'connectToField': 'parent',
'as': 'menu'
}
}, {
'$sort': {
'menu.parent': 1
}
}]其目的是像这样递归地获取树:
{
"_id": 1,
"name": "Root",
"parent: "null",
"menu": [
{..sub},{..sub},{...sub}
]
}它完成了这项工作,但是每次执行查询时,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}]这是$graphLookup的正常行为还是我错过了什么?我该如何对menu数组排序?
发布于 2020-05-24 17:49:12
在as字段中返回的文档不能保证按任何顺序。
https://docs.mongodb.com/manual/reference/operator/aggregation/graphLookup/#definition
如果您需要订单,可以考虑指定'depthField‘参数,并根据它进行排序。
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
}
])https://stackoverflow.com/questions/61988004
复制相似问题