聚合 $graphLookup 每次执行查询时都以不同的顺序检索结果?
Aggregation $graphLookup retrieving results in different order every-time the query is executed?
我有以下数据集(类别):
[{
"_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
数组进行排序?
Documents returned in the as field are not guaranteed to be in any order.
https://docs.mongodb.com/manual/reference/operator/aggregation/graphLookup/#definition
If you need an order, consider specifying the 'depthField' argument, and sorting by that.
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
}
])
我有以下数据集(类别):
[{
"_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
数组进行排序?
Documents returned in the as field are not guaranteed to be in any order.
https://docs.mongodb.com/manual/reference/operator/aggregation/graphLookup/#definition
If you need an order, consider specifying the 'depthField' argument, and sorting by that.
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
}
])