在mongodb系列中找到最老/最年轻的帖子

时间:2015-02-10 17:23:38

标签: mongodb datetime aggregation-framework datetime-format

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

鉴于name,如何查找集合中最老/最年轻的帖子?

例如:如果集合'数据'中有two个帖子:

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

鉴于名称'John',我如何找到集合中最老的帖子,即ISODate("2014-06-11T19:16:46Z")的帖子?同样对于最年轻的职位。

3 个答案:

答案 0 :(得分:19)

最老:

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 }上的索引,以提高查询效率。

答案 1 :(得分:4)

您可以将其汇总如下:

  • indexname字段上创建date_time,以便 $match$sort阶段操作可能会使用它。

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

  • $match所需的name(s)的所有记录。

  • {li> $sortdate_time按升序排列。 {li> $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")
        }
}

答案 2 :(得分:-1)

db.t.find().sort({ "date_time" : 1 }).limit(1).pretty()