假设我有一个status
和一个createdAt
字段以及其他一些字段,例如title
和content
。
状态字段可以采用open, closed, or pending
值。
我基本上想在一个查找语句中从每个状态值返回5个最新文档。这可能吗?此外,这可以在没有aggregate
的情况下完成吗?
如果是这样,怎么样?
答案 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个查询。它不是致命的(特别是如果你在状态字段上有索引)。