【发布时间】:2017-05-18 12:11:40
【问题描述】:
我在 MongoDB 中有以下场景:
每条记录都有自己的 _id 和 parentId。如果 parentId== "" 那么它是一个真正的父记录。如果 parentId 具有值,则该记录实际上是指向父记录的子记录。下面显示了一个父级及其链接的子级。
{"_id": ObjectId('586c9d275d2f62e1634978db'), parentId="", count=1, <other fields>}
{"_id": ObjectId('586c9d275d2f62e163497811'), parentId=ObjectId('586c9d275d2f62e1634978db'), count=3, <other fields>}
我想要一个查询,通过该查询可以找到按计数字段排序的所有父记录,其中所有父记录和子记录都分组在一起。例如,通过图表最容易解释:
ID6 具有与父 ID5 关联的最高计数值。下一个最高计数是 ID2,它与父 ID1 关联,最后 ID4 是父 ID,也应该返回,因此结果应该是:
ID5、ID1、ID4
HoefMeistert 帮助我提出了以下查询:
db.collection.aggregate(
[
{
$project: {
group_id : { $cond : { if: { $ne: [ "$parentId", "" ] }, then: "$parentId", else: "$_id" }},
count :1,
field1:1,
field2:1
}
},
{
$group: {
_id : "$group_id",
highest : { $max: "$count" }
},
"field1":{"$first":"$field1"},
"field2":{"$first":"$field2"},
},
{
$sort: {
highest : -1
}
}
]
);
这个查询的问题是它没有返回与父级关联的 field1 和 field2,即图中的 ID1 和 ID5。有没有办法在小组赛阶段投射与父母相关的正确字段?否则,如果小组赛返回类似:
{'_id': ObjectId('586c9d275d2f62e1634978db'), 'highest': 2}
{'_id': ObjectId('586c9d0d5d2f62e1634978d5'), 'highest': 1}
{'_id': ObjectId('586c9d365d2f62e1634978e3'), 'highest': 0}
如何在组后重新匹配以拉回上述所有 Id 的全部记录? IE。 586c9d275d2f62e1634978db, 586c9d0d5d2f62e1634978d5, 586c9d365d2f62e1634978e3 ??
【问题讨论】:
-
不介意使用 mongodb 3.4 的功能
标签: mongodb