使用一个MongoDB group()查询为该月的每一天创建一个总和数组

时间:2011-06-23 22:09:43

标签: mongodb mongodb-php

我已经创建了一个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'))
            )
        )
    )
);

2 个答案:

答案 0 :(得分:1)

如果您打算经常运行群组查询,则应考虑添加一个或多个新字段,以便按您需要的时间段进行分组。如果这是一个不需要性能调整的即席查询,那么使用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
 }
}

使用这些附加字段,我可以使用组函数执行更多操作,还可以将这些字段编入索引以便更快地进行查询。您可以像我一样选择使用整数或字符串 - 无论哪种方式都可以使用,但请记住,您的查询参数需要具有相同的数据类型。我喜欢整数,因为看起来它们应该表现得更好并且占用更少的空间(只是预感)。

答案 1 :(得分:0)

group命令不支持通过函数生成新的分组键,因此请使用map / reduce而不是group。