Найти старейший/младший пост в коллекции mongodb
У меня есть коллекция mongodb
со многими полями. Одно поле - "date_time", которое находится в формате даты и времени ISO, Ex: ISODate("2014-06-11T19:16:46Z")
, а другое поле - "имя".
Учитывая name
, как узнать старейший/самый молодой пост в коллекции?
Пример: если в коллекции "данные" есть two
сообщения:
[{'name' : 'John', 'date_time' : ISODate("2014-06-11T19:16:46Z")},
{'name' : 'John', 'date_time' : ISODate("2015-06-11T19:16:46Z")}]
Учитывая имя "Джон", как мне узнать старейший пост в коллекции, т.е. тот, у кого есть ISODate("2014-06-11T19:16:46Z")
? Точно так же для самого младшего поста.
Ответы
Ответ 1
тема:
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 }
, чтобы сделать запросы эффективными.
Ответ 2
Вы можете заполнить его следующим образом:
-
Создайте index
в полях name
и date_time
, чтобы
$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"}}}
])
о/р
{
"_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")
}
}
Ответ 3
db.t.find().sort({ "date_time" : 1 }).limit(1).pretty()