mongodb - 每次执行查询时,聚合 $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
}
]
我在这个数据集上运行以下管道以递归方式获取树:
[{
'$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
数组进行排序?
解决方案
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
}
])
推荐阅读
- vba - Excel VBA 复制和粘贴特定行数和新工作簿
- html - 为什么 MDN 建议使用沙盒将文件上传到不同的(子)域?
- enums - 在 Kotlin 的枚举类 getter 中使用 when 子句
- c# - 使用约束作为类型传递泛型类型
- git - Visual Studio 使用 lf 行结尾,如开源存储库
- php - mysqli数组到子查询中的mysql?
- docker - 在 Fedora 28 上安装 docker-ce
- javascript - 将包含方括号和双引号的字符串转换为数组
- javascript - 呈现为 HTML 的动态 JavaScript Web 资源
- excel - 带有工作表名称的间接函数