仅在 mongodb 聚合中返回具有最新子文档的文档

Posted

技术标签:

【中文标题】仅在 mongodb 聚合中返回具有最新子文档的文档【英文标题】:return document with latest subdocument only in mongodb aggregate 【发布时间】:2013-05-06 00:13:09 【问题描述】:

我有这些 Mongoose Schemas:

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

如何返回所有线程及其最新的消息子文档(限制 1)?

目前,我正在服务器端过滤 Thread.find() 结果,但出于性能问题,我想使用 aggregate() 在 MongoDb 中移动此操作。

【问题讨论】:

【参考方案1】:

您可以使用$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
]);

【讨论】:

如何返回没有消息的线程?我找不到很多关于条件的例子(除了你在 *** 上的答案) @younes0 最好将其作为一个新问题提出。 请看***.com/questions/16526763/… 做得很好 - 像这样的简单结果有据可查且详细。

以上是关于仅在 mongodb 聚合中返回具有最新子文档的文档的主要内容,如果未能解决你的问题,请参考以下文章

使用聚合查找最新批次中的文件数

MongoDB聚合在Java中具有不同的价值?

如何按小时聚合 MongoDB 文档?

聚合查询从嵌套子文档中获取最新元素的计数

在 Mongodb 中查找和聚合多个级别的子文档

用于算术运算的 MongoDB 聚合 - 子文档字段