【发布时间】:2015-08-24 04:46:40
【问题描述】:
我想找到所有名为“Hans”的用户,并通过对他们进行分组来汇总他们的“年龄”和“孩子”的数量。 假设我在我的数据库“用户”中有关注。
{
"_id" : "01",
"user" : "Hans",
"age" : "50"
"childs" : "2"
}
{
"_id" : "02",
"user" : "Hans",
"age" : "40"
"childs" : "2"
}
{
"_id" : "03",
"user" : "Fritz",
"age" : "40"
"childs" : "2"
}
{
"_id" : "04",
"user" : "Hans",
"age" : "40"
"childs" : "1"
}
结果应该是这样的:
"result" :
[
{
"age" :
[
{
"value" : "50",
"count" : "1"
},
{
"value" : "40",
"count" : "2"
}
]
},
{
"childs" :
[
{
"value" : "2",
"count" : "2"
},
{
"value" : "1",
"count" : "1"
}
]
}
]
我怎样才能做到这一点?
【问题讨论】:
-
您最好的方法是并行运行两个查询。除了非常小的数据样本之外,这是唯一实用的方法。作为一个例子来展示这将是一个很好的答案,但非常冗长。 “小数据”的愚蠢方法是推送到数组并单独处理。但这不适用于大多数“现实世界”数据集。
-
@user3561036 如果不强制使用聚合框架,我认为使用 map-reduce 将是一个选项。在这种特殊情况下,可能(?)对于更大的数据集比其他更人为的解决方案具有更好的性能。
-
@SylvainLeroux 同样的问题也适用。为了通常“按两个或更多事物分组”,您需要以组合形式表示每个事物的不同数据集。在 SQL 术语中,这基本上是一个“UNION”,但一个 union 本质上是一个“join”操作,因此 MongoDB 不这样做。就像我说的,有一些“愚蠢”的方式,但它们无法扩展。聪明的钱是在单独的“并行”查询上,并将结果组合起来发送到你的 API 中。通过这种方法,它们快速并且可扩展。就像我说的,这将是一个很好的常见问题解答,但解释很长。
-
@user3561036 这听起来很有趣。您是否有一些指向示例或描述该示例的文档?我找到了pauldone.blogspot.fr/2014/03/mongoparallelaggregation.html,但它并不完全相同。
-
@SylvainLeroux 很乐意,如果你能等一天左右,我可能会解决它,或者其他人可能会。注意到已经有一个提交的答案在这里使用了“A/B”变体,我称之为对我之前提到的初始“愚蠢”响应的修订,这在一定程度上缓解了“填充数组”问题,但也不是很好高性能..您的实际语言实现应该是一种可以发出“并行”操作并努力组合结果的语言。 Node.js async 是一个模板示例。
标签: mongodb aggregation-framework