2014-09-30 3 views
0

Пусть есть набор со следующими документами:Как я могу получить самые последние документы в MongoDB?

{ 
    _id:  0, 
    data:  'foo', 
    createdAt: Tue Sep 30 2014 17:00:00 GMT-0300 (BRT) 
} 

{ 
    _id:  1, 
    data:  'foo', 
    createdAt: Tue Sep 30 2014 18:00:00 GMT-0300 (BRT) 
} 

{ 
    _id:  2, 
    data:  'foo', 
    createdAt: Tue Sep 30 2014 18:00:00 GMT-0300 (BRT) 
} 

{ 
    _id:  3, 
    data:  'bar', 
    createdAt: Tue Sep 30 2014 18:00:00 GMT-0300 (BRT) 
} 

Как я могу получить все самые последние {data: 'foo'} документы в «одной операции»? В этом случае документы с _id1 и 2.

Я не знаю, сколько элементов, так что я не могу сделать:

db.coll.find({data: 'foo', createdAt: ???}) 

или:

db.coll.find({data: 'foo'}).sort({createdAt: -1}).limit(???); 

Единственным способом я знаю, что есть два шага:

var d = db.coll.find({data: 'foo'}).sort({createdAt: -1}).next(); 
var c = db.coll.find({data: 'foo', createdAt: d.createdAt}); 

Есть ли способ сделать это за один шаг?

Связанный вопрос: [1].

ответ

0

Предполагая, что все, что вы заботитесь о идентификационном номере и время, и не нужно, чтобы увидеть весь документ каждых возвращенного документа, вы можете использовать Aggregation Framework.

Вот непроверенный пример, который будет возвращать самая последняя временная метка вместе со всеми значениями _id, которые идут вместе с ней.

db.coll.aggregate({$match: {data: 'foo'}}, {$group: {_id: '$created_at', id: {$addToSet: '$_id'}}}, {$sort: {_id: -1}}, {$limit: 1}) 
+0

В таком формате даты, я действительно сомневаюсь, что это сработает. Будут делать некоторые исследования. –

+0

Конечно. Что вам не нравится? Группа будет работать до тех пор, пока элементы будут считаться равными. Сортировка будет зависеть от того, сохранена ли она как метка времени или строка. Я предполагаю, что это временная метка, поскольку нет кавычек, и он уже показывает способность сортировать в своем примере. – Verran

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