2013-05-11 1 views
2

У меня есть эти Mongoose Schemas:возвращения документ с последним поддокументом только в MongoDB агрегате

var Thread = new Schema({ 
    title: String, messages: [Message] 
}); 
var Message = new Schema({ 
    date_added: Date, author: String, text: String 
}); 

Как вы вернуть все темы с их последней поддокументе сообщения (ограничение 1)?

В настоящее время я фильтрую результаты Thread.find() на стороне сервера, но я хотел бы переместить эту операцию в MongoDb с помощью aggregate() для обеспечения производительности.

ответ

5

Вы можете использовать $unwind, $sort и $group сделать это, используя что-то вроде:

Thread.aggregate([ 
    // Duplicate the docs, one per messages element. 
    {$unwind: '$messages'}, 
    // Sort the pipeline to bring the most recent message to the front 
    {$sort: {'messages.date_added': -1}}, 
    // Group by _id+title, taking the first (most recent) message per group 
    {$group: { 
     _id: { _id: '$_id', title: '$title' }, 
     message: {$first: '$messages'} 
    }}, 
    // Reshape the document back into the original style 
    {$project: {_id: '$_id._id', title: '$_id.title', message: 1}} 
]); 
+0

Как бы вы вернуться даже темы без сообщений? Я не мог найти много примеров об условиях (кроме ваших ответов на stackoverflow) – younes0

+0

@ younes0 Лучше спросить об этом как о новом вопросе. – JohnnyHK

+0

См. Http://stackoverflow.com/questions/16526763/aggregate-return-document-with-no-subdocument-or-with-latest-subdocument-only – younes0

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