Mongodb聚合框架| 分组多个值?

我想使用mongoDB的Aggregation Framework来运行SQL中的内容:

SELECT SUM(A), B, C from myTable GROUP BY B, C; 

文档状态:

您可以从pipe道中的文档,以前计算的值或由多个传入字段组成的聚合键指定单个字段。

但是现在还不清楚“几个进入领域的总体关键”究竟是什么?

我的数据集有点像这样:

 [{ "timeStamp" : 1341834988666, "label" : "sharon", "responseCode" : "200", "value" : 10, "success" : "true"}, { "timeStamp" : 1341834988676, "label" : "paul", "responseCode" : "200", "value" : 60, "success" : "true"}, { "timeStamp" : 1341834988686, "label" : "paul", "responseCode" : "404", "value" : 15, "success" : "true"}, { "timeStamp" : 1341834988696, "label" : "sharon", "responseCode" : "200", "value" : 35, "success" : "false"}, { "timeStamp" : 1341834988166, "label" : "paul", "responseCode" : "200", "value" : 40, "success" : "true"}, { "timeStamp" : 1341834988266, "label" : "paul", "responseCode" : "404", "value" : 99, "success" : "false"}] 

我的查询如下所示:

 resultsCollection.aggregate( { $match : { testid : testid} }, { $skip : alreadyRead }, { $project : { timeStamp : 1 , label : 1, responseCode : 1 , value : 1, success : 1 }}, { $group : { _id : "$label", max_timeStamp : { $timeStamp : 1 }, count_responseCode : { $sum : 1 }, avg_value : { $sum : "$value" }, count_success : { $sum : 1 } }}, { $group : { ? }} ); 

我的直觉是试图将结果传递给第二组,我知道你可以做到这一点,但它不会工作,因为第一组已经太多地减less了数据集,并且所需的详细程度丢失了。

我想要做的就是使用labelresponseCodesuccess并从结果中获得值的总和。 它应该看起来有点像:

 label | code | success | sum_of_values | count sharon | 200 | true | 10 | 1 sharon | 200 | false | 35 | 1 paul | 200 | true | 100 | 2 paul | 404 | true | 15 | 1 paul | 404 | false | 99 | 1 

哪里有五个小组:

 1. { "timeStamp" : 1341834988666, "label" : "sharon", "responseCode" : "200", "value" : 10, "success" : "true"} 2. { "timeStamp" : 1341834988696, "label" : "sharon", "responseCode" : "200", "value" : 35, "success" : "false"} 3. { "timeStamp" : 1341834988676, "label" : "paul", "responseCode" : "200", "value" : 60, "success" : "true"} { "timeStamp" : 1341834988166, "label" : "paul", "responseCode" : "200", "value" : 40, "success" : "true"} 4. { "timeStamp" : 1341834988686, "label" : "paul", "responseCode" : "404", "value" : 15, "success" : "true"} 5. { "timeStamp" : 1341834988266, "label" : "paul", "responseCode" : "404", "value" : 99, "success" : "false"} 

好的,所以解决方法是为_id值指定一个聚合键。 这里logging为:

您可以从pipe道中的文档,以前计算的值或由多个传入字段组成的聚合键指定单个字段。

但它实际上并没有定义一个聚合键的格式。 在这里阅读早期的文档,我发现前面的collection.group方法可能需要多个字段,并且在新的框架中使用相同的结构。

所以,要组合多个字段,你可以使用_id : { success:'$success', responseCode:'$responseCode', label:'$label'}

如:

 resultsCollection.aggregate( { $match : { testid : testid} }, { $skip : alreadyRead }, { $project : { timeStamp : 1 , label : 1, responseCode : 1 , value : 1, success : 1 }}, { $group : { _id : { success:'$success', responseCode:'$responseCode', label:'$label'}, max_timeStamp : { $timeStamp : 1 }, count_responseCode : { $sum : 1 }, avg_value : { $sum : "$value" }, count_success : { $sum : 1 } }} );