我有一个查询:
db.test.aggregate( {$group : { _id : '$key', frequency: { $sum : 1 } } } )
这将让测试组关键的每一个枚举的频率。 基本上,我已经得到密钥的分发。
现在想象一下,我想KEY1,KEY2和KEY3(所以三套不同的发行)的分布。
很显然,我可以运行此查询每个单独的键3次,但看起来我们将能够通过允许在同一时间统计所有3项优化查询。 我一直在玩弄它和搜索整个卷带间的,但到目前为止,我委托给运行三个独立的聚集查询或使用的map / reduce功能。
没有人有任何其他的想法?
还有,你可以在这里使用了几个不同的方法:
使用的map / reduce:不这样做。 现在,这将是更快运行聚合框架3倍使用地图功能降低这个用例。
运行聚集3倍。 这是不是最佳的,但如果你没有时间的限制,那么这是最简单的选择。 如果您的聚集正在<几秒钟反正那么我就不会担心优化,直到他们成为一个问题。
这是我能想到的最好的全能作品。 在$group
运营商允许你建立一个_id
多个领域。 例如, {"_id":{"a":"$key1", "b":"$key2", "c":"$key3"}}
这样做会为您的不同钥匙的所有现有组合的分组。 你可能这样一群你的密钥,然后跨客户端的结果手动总结。
让我解释。 比方说,我们有形状的集合。 这些形状可具有颜色,大小,和一种(方形,圆形等)。 在多密钥ID的集合可能看起来像:
db.shapes.aggregate({$group:{_id:{"f1":"$f1", "f2":"$f2", "f3":"$f3"}, count:{"$sum":1}}})
并返回:
"result" : [
{
"_id" : {
"f1" : "yellow",
"f2" : "medium",
"f3" : "triangle"
},
"count" : 4086
},
{
"_id" : {
"f1" : "red",
"f2" : "small",
"f3" : "triangle"
},
"count" : 4138
},
{
"_id" : {
"f1" : "red",
"f2" : "big",
"f3" : "square"
},
"count" : 4113
},
{
"_id" : {
"f1" : "yellow",
"f2" : "small",
"f3" : "triangle"
},
"count" : 4145
},
{
"_id" : {
"f1" : "red",
"f2" : "small",
"f3" : "square"
},
"count" : 4062
}
... 等等
这样,你会总结成绩的客户端,在入口的大幅减少数量。 相比之下,文档总数假设每个键唯一值的数量是足够小,你可以做的时间可忽略不计这最后一步。