Найти старейший/младший пост в коллекции 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()