МонгоБД:Ограничение результатов запроса $gt (из pymongo)

StackOverflow https://stackoverflow.com/questions/2291307

  •  21-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

Вы можете сделать это, используя группа.В вашем примере вам нужно будет предоставить функцию javascript для вычисления ключа (а также функцию сокращения), потому что вам нужен только компонент даты поля 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) }'
)

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top