Рассмотрим сборник, состоящий из документов, следующего вида:нужно максимальное значение в коллекции MongoDB, и его временная метка
{
"_id" : ObjectId("55f3600da9fb6e4f937a50a7"),
"timestamp" : ISODate("2010-01-01T08:10:00Z"),
"temperature" : 12.31
}
{
"_id" : ObjectId("55f3600da9fb6e4f937a50a8"),
"timestamp" : ISODate("2010-01-01T08:15:00Z"),
"temperature" : 12.48
}
...
Я хочу найти температуру макс на каждый день года, и в времени. Первая часть достаточно легко с агрегацией трубопроводной:
[{"$group" : {"_id" : {"day": { "$dayOfYear": "$timestamp" }},
"max_temperature": {"$max" : "$temperature"}}},
{"$sort" : {"_id.day":1}}]
Это дает мне хороший набор результаты с максимальной температурой на каждый день:
{u'max_temperature': 20.98, u'_id': {u'day': 1}}
{u'max_temperature': 24.15, u'_id': {u'day': 2}}
{u'max_temperature': 22.02, u'_id': {u'day': 3}}
...
Но, как я получаю метки времени когда каждый ежедневный максимум произошел? Что-то вроде:
{u'max_temperature': 20.98, u'time_of_max': ISODate("2010-01-01T15:11:12"), u'_id': {u'day': 1}}
{u'max_temperature': 24.15, u'time_of_max': ISODate("2010-01-02T16:03:42"), u'_id': {u'day': 2}}
{u'max_temperature': 22.02, u'time_of_max': ISODate("2010-01-03T16:33:59"), u'_id': {u'day': 3}}
...
Ваше первое предложение определенно работает, и это подход, о котором я не думал. Поиск максимальной температуры для каждого дня с использованием исходного подхода занимает около 0,1 с на моей NUC. Добавление времени суток с использованием вашего подхода занимает около 0,4. Жаль, что нет способа сохранить документ, который удовлетворяет агрегату '$ max'. – TomK
@TomK Все дело в том, что то, что вы запрашиваете, это «несколько значений из сопоставленного документа», что является «противоположностью» того, что «$ max» делает. Оператор '$ max' находит« максимум »из« где угодно »в рамках условия группировки, но вы хотите, чтобы« два свойства »находились на границе« максимальной »группировки, и это означает, что должен существовать' 'sort'. Это не «мой» подход, это «единственный» подход без сохранения отдельных предварительно агрегированных данных. И это последнее, что мы часто делаем по соображениям производительности. –