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

use*_*658 16 datetime datetime-format mongodb aggregation-framework

我有一个mongodb有很多领域的集合.一个字段是'date_time',它是ISO日期时间格式,Ex:,ISODate("2014-06-11T19:16:46Z")另一个字段是'name'.

鉴于a name,如何找到该系列中最老/最年轻的帖子?

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

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

鉴于"约翰"这个名字,我如何找到该系列中最老的帖子,即ISODate("2014-06-11T19:16:46Z")哪一个?同样对于最年轻的帖子.

wdb*_*ley 24

最老的:

db.posts.find({ "name" : "John" }).sort({ "date_time" : 1 }).limit(1)
Run Code Online (Sandbox Code Playgroud)

最新:

db.posts.find({ "name" : "John" }).sort({ "date_time" : -1 }).limit(1)
Run Code Online (Sandbox Code Playgroud)

索引{ "name" : 1, "date_time" : 1 }使查询有效.

  • 在 Python 中,最新的是 `db.posts.find({ "name" : "John" }).sort('date_time', pymongo.DESCENDING).limit(1)`。 (3认同)

Bat*_*eam 5

您可以将其汇总如下:

  • indexnamedate_time字段上创建一个,以便 $matchand $sort阶段操作可以使用它。

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

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

  • $sortdate_time升序排列。
  • $groupname外地。使用$ first运算符可获取组的第一条记录,该记录也将是最早的。使用$ last 运算符可获取组中的最后一条记录,该记录也是最新的。
  • 要获取整个记录,请使用$$ ROOT系统变量。

码:

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

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")
        }
}
Run Code Online (Sandbox Code Playgroud)