如何计算在相同的MongoDB汇聚$组查询多个密钥?(How do I count multiple

2019-09-03 21:19发布

我有一个查询:

db.test.aggregate( {$group : { _id : '$key', frequency: { $sum : 1 } } } )

这将让测试组关键的每一个枚举的频率。 基本上,我已经得到密钥的分发。

现在想象一下,我想KEY1,KEY2和KEY3(所以三套不同的发行)的分布。

很显然,我可以运行此查询每个单独的键3次,但看起来我们将能够通过允许在同一时间统计所有3项优化查询。 我一直在玩弄它和搜索整个卷带间的,但到目前为止,我委托给运行三个独立的聚集查询或使用的map / reduce功能。

没有人有任何其他的想法?

Answer 1:

还有,你可以在这里使用了几个不同的方法:

  1. 使用的map / reduce:不这样做。 现在,这将是更快运行聚合框架3倍使用地图功能降低这个用例。

  2. 运行聚集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
        }

... 等等

这样,你会总结成绩的客户端,在入口的大幅减少数量。 相比之下,文档总数假设每个键唯一值的数量是足够小,你可以做的时间可忽略不计这最后一步。



文章来源: How do I count multiple keys in the same MongoDB aggregation $group query?