问题描述
||
我创建了一个MongoDB聚合查询,该查询将为我提供当月的数据总和,但是如何修改此数据,以便它将返回该月的每一天的数组,以及每一天的总数(我假设这是可行的,但我发现很难使其正常运行吗?如果这不可能,那么有没有比使用循环并运行30个组查询更好的方法了?
我正在使用PHP驱动程序,但是在shell中回答同样有用。
$total_this_month = $db->test->group(
array( ),array(
\'sum\' => 0
),new MongoCode( \'function(doc,out){ out.sum += doc.data; }\' ),array(
\'condition\' => array(
\'time\' => array(
\'$gte\' => new MongoDate(strtotime(\'first day of this month,00:00:00\')),\'$lte\' => new MongoDate(strtotime(\'last day of this month,23:59:59\'))
)
)
)
);
解决方法
如果您计划运行组查询,则通常应考虑添加一个或多个新字段,以使您可以根据需要的时间段进行分组。如果这是不需要性能调整的即席查询,那么使用map-reduce的先前答案是一个很好的答案。例如,我有一个集合,有时需要按天,周,月等进行汇总。这是一个示例记录:
{\"_id\" : ObjectId(\"4ddaed3a8b0f766963000003\"),\"name\": \"Sample Data\",\"time\" : \"Mon May 23 2011 17:26:50 GMT-0600 (MDT)\",\"period\" : {
\"m\" : 201105,\"w\" : 201121,\"d\" : 20110523,\"h\" : 2011052317
}
}
使用这些附加字段,我可以使用group函数做更多的事情,还可以为这些字段建立索引以进行更快的查询。您可以选择使用整数,也可以使用字符串,也可以使用字符串-两种方法都可以,但是请记住,您的查询参数必须具有相同的数据类型。我喜欢整数,因为它们似乎应该表现得更好,并且使用更少的空间(预感)。
, group命令不支持通过函数生成新的分组键,因此请使用map / reduce而不是group。