我有以下文件:
{'_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 ...
答案 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聚合; - )