2015-04-30 2 views
0

У меня есть коллекция, скажем, «вещи»:Получить последний созданный объект для каждого пользователя?

{ id: 1 
    creator: 1 
    created: Today } 
{ id: 2 
    creator: 2 
    created: Today } 
{ id: 3 
    creator: 2 
    created: Yesterday } 

Я хотел бы создать запрос, который будет возвращать каждую вещь, созданную с помощью набора пользователей, но только их совсем недавно была создана вещь.

Как это будет выглядеть? Я могу получить поиск в моей коллекции с помощью множества создателей, и он отлично работает - как я могу получить только последний созданный объект для каждого пользователя?

Thing.find({ _creator : { "$in" : creatorArray })... 
+0

Что такое тип 'created'? Это 'ISODate'? – BatScream

+0

Да, это ISODate. – opticon

ответ

3

Вы не можете find, sort и выбрать самый последний всего лишь одним find() запроса. Но вы можете сделать это с помощью агрегации:

  • Match все записи, в которых творец среди того, кто мы ищем для.
  • Sort записи в порядке убывания в зависимости от созданного поля.
  • Group документы на основе создателя.
  • Выберите первый документ каждого автора из группы, который также будет его последним.
  • Project обязательные поля.

сниппет:

Thing.aggregate([ 
{$match:{"creator":{$in:[1,2]}}}, 
{$sort:{"created":-1}}, 
{$group:{"_id":"$creator","record":{$first:"$$ROOT"}}}, 
{$project:{"_id":0, 
      "id":"$record.id", 
      "creator":"$record.creator", 
      "created":"$record.created"}} 
], function(err,data){ 
    }) 
+0

Это код MongoDB, или Mongoose? – opticon

+0

Это мангуста, квадратные скобки необязательны. - http://mongoosejs.com/docs/api.html#model_Model.aggregate. – BatScream

+0

Красивая! знаете ли вы, если я могу заполнить поля в той же команде, используя '.populate'? Я хотел бы заполнить поле создателя своим именем пользователя. – opticon

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