在 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 }
上建立索引以提高查询效率。
您可以将其汇总如下:
在 name
和 date_time
字段上创建一个 index
,以便
$match
和 $sort
阶段操作可能会用到它。
db.t.ensureIndex({"name":1,"date_time":1})
$match
所需 name(s)
.
的所有记录
$sort
按 date_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()
我有一个包含许多字段的 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 }
上建立索引以提高查询效率。
您可以将其汇总如下:
在
name
和date_time
字段上创建一个index
,以便$match
和$sort
阶段操作可能会用到它。db.t.ensureIndex({"name":1,"date_time":1})
$match
所需name(s)
. 的所有记录
$sort
按date_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()