【问题标题】:MongoDB sorting on childrenMongoDB对孩子进行排序
【发布时间】:2016-12-01 05:00:27
【问题描述】:

我有以下文件:

    {'_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 的子节点。我需要一个按“计数”(降序)排序的查询,但是我只希望它返回 parentId 的游标。但是,如果子项计数最高,则表示总体上的最高值,应返回该子项的父项。

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

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

【问题讨论】:

  • 你能显示你的输出文件吗?
  • 嗨 Shaishab,我希望输出与上面的文档相同。这就是预测的一切。 IE。 Id1 包含所有自己的字段,与子级无关,即使子级影响查询
  • 那么id7的位置是什么?
  • 它不包含在输出中,因为它是一个父节点为 id1 的子节点。然而,由于这个节点,它使 id1 最高,因此它首先在输出中返回。

标签: mongodb


【解决方案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 之前的聚合;-)

【讨论】:

  • 您好 HoefMeistert,感谢您的回答,我只是走过它。这不是总结了所有孩子和父母的人数吗?我只想要该组的最高计数而不一定是总和。将 $sum 更改为 $max 会解决此问题吗?我只是想通了
  • 我还认为 3.2 是最高的 mongo 版本
  • @xenophon MongoDB 3.4 本周发布:Announcing the General Availability of MongoDB 3.4$graphLookup pipeline stage 进行递归查找(带有查询过滤器和深度选项),因此应该对您的用例有所帮助。
  • @xenophon 是的,你可以使用 $max,我想我处于求和模式 :) 他们的想法保持不变 ;-)
  • 非常感谢 HoefMeistert!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-26
  • 1970-01-01
  • 2017-04-19
  • 2018-10-11
  • 1970-01-01
  • 2018-03-22
相关资源
最近更新 更多