MongoDB在一个查找语句中返回每个类别的最新文档?

时间:2014-12-24 10:26:31

标签: mongodb meteor

假设我有一个status和一个createdAt字段以及其他一些字段,例如titlecontent

状态字段可以采用open, closed, or pending值。

我基本上想在一个查找语句中从每个状态值返回5个最新文档。这可能吗?此外,这可以在没有aggregate的情况下完成吗?

如果是这样,怎么样?

3 个答案:

答案 0 :(得分:0)

尝试以下

db.collectionName.find().sort({"_id":-1}).limit(5).pretty()

它返回了最新的五个文件

答案 1 :(得分:0)

坏消息:基本查询无法实现。原因很简单:您只能限制完整的结果集。因此,即使在状态字段上使用逻辑OR,结果集的前20个文档也可能都处于“已关闭”状态。当您对此结果集应用任何限制时,前20个文档的状态将为“已关闭”。

我甚至不确定这可以通过聚合轻松完成,我必须考虑这一点。

答案 2 :(得分:0)

Markus对。遗憾的是,由于在项目阶段缺少 slice 操作,因此无法在一个聚合查询中执行此操作聚合管道。

这意味着,您可以按照以下状态轻松地对文档进行分组:

db.collectionName.aggregate([        
        { "$group": {
            "_id": "$status",
            "docs": { "$push": "$title" }
        }}
    ]);

但是在此聚合期间无法对生成的子阵列进行切片。此功能为requested,但尚未实施。

您可以使用单独的命令在聚合后对其进行切片。或者您始终可以选择使用Map-Reduce

另一种选择是在每个状态下迭代应用程序中的状态和查询文档。我会在你的场景中使用这个解决方案,因为你只有3种不同的状态。这意味着只有3个查询。它不是致命的(特别是如果你在状态字段上有索引)。