当前位置: 首页 > 面试题库 >

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

宗意蕴
2023-03-14
问题内容

我有这些猫鼬模式:

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

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

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


问题答案:

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


 类似资料:
  • 假设我有以下JSON结构,我希望按性别分组,并希望在同一字段中返回多个文档值: 现在我知道我可以做这样的事情,但是我需要把年龄和名字合并到一个字段中。

  • 问题内容: 我想获取更新的文档。这是我的原始代码,它成功更新但没有返回文档。 我使用了toArray函数,但是这给出了错误“没有提供的回调就不能使用writeConcern”: 有任何想法吗? 问题答案: 只会向自己的回调报告受影响的文档数。 要在修改时检索文档,可以改用(以前称为)。 更新:在mongoDB中执行时,请使用;如果使用mongoose,则可以使用。以上是Node.js驱动程序。 注

  • 我有两个集合A和B,我在另一个集合B中有一个字段的引用,因此将两个结果聚合到: 集合A中的文件是:

  • 我在尝试使用MongooseJs在Mongodb中按嵌套数组排序时遇到了一个小问题。 a)一个产品包含任务,每个任务都有子任务。 b)任务有顺序 这是一个示例产品文档: 结果: } 我正在使用MongoDB聚合管道来订购任务 结果: } 预期结果: 我真的很接近了,所有的排序似乎都在工作。我只需要一些帮助来将子任务放回父母体内。非常感谢任何帮助。 谢谢

  • 我试图使用MongoDb列出展开嵌套数组。 一个产品包含任务,每个任务可以有零个、一个或多个子任务。 以下是产品文档示例: 结果: 聚合管道在对任务进行排序方面起到了很大的作用 有时任务没有子任务,例如: 当他们没有孩子的时候,还有什么可以帮助他们完成任务吗? 当前聚合: 期望的结果:

  • 我有一个名为results的集合,其中每个文档都有一个标记(唯一)和一个嵌入文档(服务)列表。 样本: 我想使用mongo模板(spring boot)提取一个基于令牌和服务id的服务。下面是一个代码片段: 服务级别: 上面的代码执行此查询: 方法返回空Service对象! 为了获得服务对象,我的聚合中是否有任何更改要做?