首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >每次执行查询时,聚合$graphLookup检索的结果都是不同的顺序?

每次执行查询时,聚合$graphLookup检索的结果都是不同的顺序?
EN

Stack Overflow用户
提问于 2020-05-24 15:14:49
回答 1查看 1.9K关注 0票数 5

我有以下数据集(类别):

代码语言:javascript
复制
[{
  "_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
 }
]

我正在这个数据集上运行以下管道来递归地获取树:

代码语言:javascript
复制
[{
  '$match': {
    '_id': 1
  }
}, {
  '$graphLookup': {
    'from': 'categories', 
    'startWith': '$_id', 
    'connectFromField': '_id', 
    'connectToField': 'parent', 
    'as': 'menu'
  }
}, {
    '$sort': {
      'menu.parent': 1
    }
  }]

其目的是像这样递归地获取树:

代码语言:javascript
复制
{
    "_id": 1,
    "name": "Root",
    "parent: "null",
    "menu": [
        {..sub},{..sub},{...sub}
    ]
}

它完成了这项工作,但是每次执行查询时,menu数组中元素的顺序都是不同的。每次都是!

代码语言:javascript
复制
"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数组排序?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

解决方案:

代码语言:javascript
复制
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
  }
])

MongoPlayground

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61988004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档