如何限制mongodb聚合管道中$ group中的文档?

时间:2017-04-15 17:22:24

标签: mongodb

假设在mongo db中有这些虚拟文档:

{
  "_id" : ObjectId("58f24f38e5fe51fa52e3a90c"),
  "ref" : "r1",
  "ts" : 1492275000121
}
{
  "_id" : ObjectId("58f24f54e5fe51fa52e3a90d"),
  "ref" : "r1",
  "ts" : 1492275028031
}
{
  "_id" : ObjectId("58f24f5ce5fe51fa52e3a90e"),
  "ref" : "r2",
  "ts" : 1492275036560
}
{
  "_id" : ObjectId("58f24f62e5fe51fa52e3a90f"),
  "ref" : "r3",
  "ts" : 1492275042696
}
{
  "_id" : ObjectId("58f24f64e5fe51fa52e3a910"),
  "ref" : "r2",
  "ts" : 1492275044864
}
{
  "_id" : ObjectId("58f24f69e5fe51fa52e3a911"),
  "ref" : "r1",
  "ts" : 1492275049360
}
{
  "_id" : ObjectId("58f24f6be5fe51fa52e3a912"),
  "ref" : "r3",
  "ts" : 1492275051880
}
{
  "_id" : ObjectId("58f24f6ee5fe51fa52e3a913"),
  "ref" : "r3",
  "ts" : 1492275054512
}
{
  "_id" : ObjectId("58f24f70e5fe51fa52e3a914"),
  "ref" : "r2",
  "ts" : 1492275056344
}

我想要实现的是获取文档列表,每个ref一个文档列表,其中包含最新的时间戳(ts)。

类似的东西:

  • 获取ref所在的所有文件["r1", "r2"]
  • ref
  • 对这些文件进行分组
  • 为每个组根据ts
  • 返回最新文档

我期待:

[
    {
        "ref":"r1",
        "ts": 1492275049360
    },{
        "ref":"r2",
        "ts": 1492275056344
    }
]

我可以使用单个数据库请求执行此操作吗?我查看了聚合函数,但找不到获取组的最新文档的方法。

1 个答案:

答案 0 :(得分:1)

您可以$sort使用ts后跟$first中的$group

db.collection.aggregate(
   [
     { $match: { ref: { $in: ["r1", "r2"] } } },
     { $sort: { ts: -1 } },
     { $group: { _id: "$ref", ts: { $first: "$ts" } } }
   ]
)