在 mongodb 集合中找到 oldest/youngest post

Find oldest/youngest post in mongodb collection

我有一个包含许多字段的 mongodb 集合。一个字段是 'date_time',采用 ISO 日期时间格式,例如:ISODate("2014-06-11T19:16:46Z"),另一个字段是 'name'。

给定一个 name,我如何找出集合中的 oldest/youngest post?

例如:如果集合中有 two posts 'data' :

[{'name' : 'John', 'date_time' : ISODate("2014-06-11T19:16:46Z")},
 {'name' : 'John', 'date_time' : ISODate("2015-06-11T19:16:46Z")}]

给定名称 'John' 我如何找出集合中最旧的 post,即带有 ISODate("2014-06-11T19:16:46Z") 的那个?同样对于最小的 post.

最年长的:

db.posts.find({ "name" : "John" }).sort({ "date_time" : 1 }).limit(1)

最新:

db.posts.find({ "name" : "John" }).sort({ "date_time" : -1 }).limit(1)

{ "name" : 1, "date_time" : 1 } 上建立索引以提高查询效率。

您可以将其汇总如下:

  • namedate_time 字段上创建一个 index,以便 $match$sort 阶段操作可能会用到它。

    db.t.ensureIndex({"name":1,"date_time":1})

  • $match 所需 name(s).

  • 的所有记录
  • $sortdate_time 升序排列。
  • $group 通过 name 字段。使用 $first 运算符获取第一个 该组的记录,这也将是最古老的。使用 $last 运算符获取组中的最后一条记录,这也将是 最新.
  • 要获取整个记录,请使用 $$ROOT 系统变量。

代码:

db.t.aggregate([
{$match:{"name":"John"}},
{$sort:{"date_time":1}},
{$group:{"_id":"$name","oldest":{$first:"$$ROOT"},
                       "youngest":{$last:"$$ROOT"}}}
])

o/p:

{
        "_id" : "John",
        "oldest" : {
                "_id" : ObjectId("54da62dc7f9ac597d99c182d"),
                "name" : "John",
                "date_time" : ISODate("2014-06-11T19:16:46Z")
        },
        "youngest" : {
                "_id" : ObjectId("54da62dc7f9ac597d99c182e"),
                "name" : "John",
                "date_time" : ISODate("2015-06-11T19:16:46Z")
        }
}
db.t.find().sort({ "date_time" : 1 }).limit(1).pretty()