0

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

2 回答 2

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
 }
}

有了这些额外的字段,我可以用 group 函数做更多的事情,还可以索引这些字段以更快地查询。您可以像我一样选择使用整数或字符串 - 任何一种方式都可以,但请记住您的查询参数必须是相同的数据类型。我喜欢整数,因为它们似乎应该表现得更好一点并且使用更少的空间(只是预感)。

于 2011-06-24T18:06:26.577 回答
0

group 命令不支持通过函数生成新的分组键,所以使用 map/reduce 代替 group。

于 2011-06-24T15:49:26.150 回答