2013-03-11 4 views
3

У меня есть тысячи документов в MongoDB с некоторыми из образца, как показано ниже:Найти отдельные документы с максимальным значением поля в MongoDB

{"title":"Foo", "hash": "1234567890abcedf", "num_sold": 49, 
"created": "2013-03-09 00:00:00"} 

{"title":"Bar", "hash": "1234567890abcedf", "num_sold": 55, 
"created": "2013-03-11 00:00:00"} 

{"title":"Baz", "hash": "1234567890abcedf", "num_sold": 55, 
"created": "2013-03-10 00:00:00"} 

{"title":"Spam", "hash": "abcedef1234567890", "num_sold": 20, 
"created": "2013-03-11 00:00:00"} 

{"title":"Eggs", "hash": "abc1234567890def", "num_sold": 20, 
"created": "2013-03-11 00:00:00"} 

Можно выбрать все документы с отчетливым hash, который имеет максимальный num_sold и если имеется более одного документа с тем же num_sold, выберите последний документ из поля created.

Я использую PyMongo для клиента.

ответ

8

Я не эксперт по Python, поэтому напишу это в JavaScript. Вы можете сделать это с помощью рамок агрегации с использованием $sort, $group и $first opreators:

db.col.aggregate([ 
    {$sort: {created:-1}}, 
    {$group: {_id: '$hash', num_sold: {$first: '$num_sold'}, _id_seen: {$first: '$_id'}}} 
]) 

По сути то, что я делаю, сортировать входящие документы по их дате создания DESC, а затем я группа на хэш, конкатенации двух повторяющихся хэшей и то я получаю первый результат сортированной группы, которая должна быть новейшим документом.

Ссылки:

+0

Я попытался это, но он выбирает только 'hash' поле, но требуют' _id' объекта, чтобы правильно выбрать документ. – cnu

+0

@cnu Вы можете добавить _id вот так, отредактировал – Sammaye

+0

спасибо большое. Я думаю, что работает (по крайней мере выбирает правильное количество документов). Я буду отмечать ваш ответ как принятый после проверки идентификаторов документов. – cnu

Смежные вопросы