MongoDB: ограничение результатов запроса $ gt (из pymongo) - PullRequest
3 голосов
/ 18 февраля 2010

Я собираю некоторую статистику из веб-службы и храню ее в коллекции. Данные выглядят примерно так (но с большим количеством полей):

{"downloads": 30, "dt": "2010-02-17T16:56:34.163000"}
{"downloads": 30, "dt": "2010-02-17T17:56:34.163000"}
{"downloads": 30, "dt": "2010-02-17T18:56:34.163000"}
{"downloads": 30, "dt": "2010-02-17T19:56:34.163000"}
{"downloads": 30, "dt": "2010-02-17T20:56:34.163000"}
{…}
{"downloads": 30, "dt": "2010-02-18T17:56:34.163000"}
{"downloads": 30, "dt": "2010-02-18T18:56:34.163000"}
{"downloads": 30, "dt": "2010-02-18T19:56:34.163000"}
{"downloads": 30, "dt": "2010-02-18T20:56:34.163000"}

Если кто-то запрашивает ежедневные цифры за последние тридцать дней, это будет означать максимальное количество (в этом примере) «скачиваний» pr. день. Какая последняя запись дня.

Используя collection.find({"dt": {"$gt": datetime_obj_30_days_ago}}), я, конечно, получаю все строки, что не очень подходит. Поэтому я ищу способ вернуть только последний день за указанный период.

Мне сказали, что group() может быть правильным, но я не совсем понимаю, как заставить его работать в этом случае.

Любые советы, указатели будут очень благодарны!

1 Ответ

1 голос
/ 19 февраля 2010

Вы можете сделать это, используя группу . В вашем примере вам понадобится предоставить функцию javascript для вычисления ключа (а также функцию Reduce), потому что вам нужен только компонент date поля datetime. Это должно работать:

db.coll.group(
    key='function(doc) { return {"dt": doc.dt.toDateString()} }',
    condition={'dt': {'$gt': datetime_obj_30_days_ago}},
    initial={'downloads': 0},
    reduce='function(curr, prev) { prev.downloads = Math.max(curr.downloads, prev.downloads) }'
)

Имейте в виду, что по-прежнему выполняется линейное сканирование за последний месяц, только на сервере, а не на клиенте. возможно , что простой выбор максимального значения каждого дня в отдельности происходит быстрее.

...