我有一个包含许多字段的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")
的帖子?同样对于最年轻的职位。
答案 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)
您可以将其汇总如下:
在index
和name
字段上创建date_time
,以便
$match
和$sort
阶段操作可能会使用它。
db.t.ensureIndex({"name":1,"date_time":1})
$match
所需的name(s)
的所有记录。
$sort
按date_time
按升序排列。
{li> $group
位于name
字段。使用$first运算符获取第一个运算符
该组的记录,也将是最古老的。使用$last
运算符获取组中的最后一条记录,也将是
最新。
代码:
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()