Mongodb 聚合$graphLookup是否在每次执行查询时以不同的顺序检索结果?

Mongodb 聚合$graphLookup是否在每次执行查询时以不同的顺序检索结果?,mongodb,mongoose,mongodb-query,aggregation-framework,graphlookup,Mongodb,Mongoose,Mongodb Query,Aggregation Framework,Graphlookup,我有以下数据集(类别): 我正在该数据集上运行以下管道以递归方式获取树: [{ '$match': { '_id': 1 } }, { '$graphLookup': { 'from': 'categories', 'startWith': '$_id', 'connectFromField': '_id', 'connectToField': 'parent', 'as': 'menu' } }, { '$sort

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

我正在该数据集上运行以下管道以递归方式获取树:

[{
  '$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" : [{... 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
的正常行为还是我错过了什么?如何对
菜单
数组排序

在as字段中返回的文档不保证以任何顺序返回

如果您需要一个订单,请考虑指定“DethField'参数,并按此排序。

解决方法:

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
  }
])
db.categories.aggregate([
{
“$match”:{
“_id”:1
}
},
{
“$graphLookup”:{
“来自”:“类别”,
“startWith”:“$\u id”,
“connectFromField”:“\u id”,
“connectToField”:“父级”,
“as”:“菜单”,
深度字段:“订单”
}
},
{
$展开:“$菜单”
},
{
$sort:{
_id:1,
“菜单.顺序”:1
}
},
{
$group:{
_id:“$\u id”,
姓名:{
$first:“$name”
},
家长:{
$first:“$parent”
},
菜单:{
$push:“$menu”
}
}
},
{

$unset:“menu.order”//更改为$project:{“menu.order”:0}对于MongoDB,非常感谢您的回答。我只有一个问题,使用我的管道并在JS中对菜单数组进行排序是否比使用这些额外的管道更好?据您所知,什么会更快、更划算?@saibbyweb对于少量数据,JS/BSON order具有相同的性能。对于大型数据集,BSON将有赌注再次感谢,祝你有一个美好的一天。
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
  }
])