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 }使查询有效.
您可以将其汇总如下:
index在name和date_time字段上创建一个,以便
$matchand $sort阶段操作可以使用它。
db.t.ensureIndex({"name":1,"date_time":1})
$match所需的所有记录name(s)。
$sort按date_time升序排列。$group在name外地。使用$ first运算符可获取组的第一条记录,该记录也将是最早的。使用$ last
运算符可获取组中的最后一条记录,该记录也是最新的。码:
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)
| 归档时间: |
|
| 查看次数: |
9445 次 |
| 最近记录: |