MongoDB对儿童进行排序

时间:2016-12-01 05:00:28

标签: mongodb

我有以下文件:

    {'_id':'id1','parentId':"",'count':1}
    {'_id':'id2','parentId':"",'count':12}
    {'_id':'id3','parentId':"",'count':16}
    {'_id':'id4','parentId':"id2",'count':3}
    {'_id':'id5','parentId':"id2",'count':3}
    {'_id':'id6','parentId':"id1",'count':0
{'_id':'id7','parentId':"id1",'count':122}

带有“”字段的parentId表示父节点。如果parentId存在,则表示给定的parentId的子节点。我需要一个对'count'(降序)进行排序的查询,但是我只希望它返回parentId的游标。但是,如果子计数最高,则表示总体最高值,并且应返回该子项的父项。

对上述数据运行查询的结果应该按以下顺序给我文档:id1,id3,id2

我考虑过启动聚合管道。对于第一阶段,我可以按计数进行排序。但是,我不知道如何让查询返回一个孩子的parentId ...

1 个答案:

答案 0 :(得分:1)

您可以使用以下聚合执行此操作:

db.collection.aggregate(
  [
    {
      $project: {
      group_id : { $cond : { if: { $ne: [ "$parentId", "" ] }, then: "$parentId", else: "$_id" }},
      count :1
      }
    },
    {
      $group: {
      _id : "$group_id",
      total_count : { $sum: "$count" }
      }
    },
    {
      $sort: {
      total_count : -1
      }
    }
  ]
);

首先我投射一个额外的字段" group_id"根据parentId值填充_id或parentId。 group_id字段用于分组并进行总计数。最后一步是对total_count进行分组。

当你使用mongoDb 3.4时,你可以查看$graphLookup但是现在我给你留下前3.4聚合; - )