Используйте один запрос MongoDB group (), чтобы создать массив сумм для каждого дня месяца. - PullRequest
0 голосов
/ 24 июня 2011

Я создал запрос агрегации MongoDB, который даст мне сумму данных за текущий месяц, но как я могу изменить это так, чтобы он возвращал массив за каждый день месяца, с суммой за каждый день (Я предполагаю, что это возможно, но мне трудно заставить его работать)? Если это невозможно, есть ли лучший способ сделать это, чем использовать цикл и выполнить 30 групповых запросов?

Я использую драйвер PHP, но ответ в оболочке так же полезен.

$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 ]

1 голос
/ 24 июня 2011

Если вы планируете часто выполнять групповой запрос, вам следует подумать о добавлении нового поля или полей, которые позволят вам группировать по нужному периоду времени. Предыдущий ответ об использовании map-lower - отличный вариант, если это специальный запрос, который не требует настройки производительности. Например, у меня есть коллекция, которую иногда нужно агрегировать по дням, неделям, месяцам и т. Д. Вот пример записи:

{"_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
 }
}

С этими дополнительными полями я могу сделать намного больше с помощью функции группы, а также индексировать эти поля для более быстрых запросов. Вы можете использовать целые числа, как я, или строки - в любом случае будет работать, но помните, что параметры вашего запроса должны быть одного типа данных. Мне нравятся целые числа, потому что кажется, что они должны работать немного лучше и использовать меньше места (просто догадка).

0 голосов
/ 24 июня 2011

Команда group не поддерживает генерацию новых группирующих ключей с помощью функции, поэтому используйте map / redu вместо группы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...