Подтвердить что ты не робот

Получить последнюю запись из коллекции mongodb

Я хочу узнать самую последнюю запись в коллекции. Как это сделать?

Примечание. Я знаю, что следующие запросы в командной строке:

1. db.test.find().sort({"idate":-1}).limit(1).forEach(printjson);
2. db.test.find().skip(db.test.count()-1).forEach(printjson)

где idate имеет добавленную метку времени.

Проблема в том, что сбор данных - это время, чтобы вернуть данные, и моя коллекция "test" действительно огромна. Мне нужен запрос с постоянным ответом времени.

Если есть лучший запрос командной строки mongodb, сообщите мне.

4b9b3361

Ответ 1

Это пересмотр предыдущего ответа, но он скорее работает на разных версиях mongodb.

db.collection.find().limit(1).sort({$natural:-1})

Ответ 2

Это даст вам один последний документ для collection

db.collectionName.findOne({}, {sort:{$natural:-1}})

$natural:-1 означает порядок, противоположный тому, который вставляются записи.

Изменить. Для всех downvoters выше - синтаксис Mongoose, Синтаксис командной строки mongo: db.collectionName.find({}).sort({$natural:-1}).limit(1)

Ответ 3

Мне нужен запрос с постоянным ответом времени

По умолчанию индексы в MongoDB являются B-деревьями. Поиск B-Tree - это операция O (logN), поэтому даже find({_id:...}) не будет предоставлять постоянное время, O (1) ответы.

При этом вы также можете сортировать по _id, если вы используете ObjectId для своих идентификаторов. Подробнее см. здесь. Конечно, даже это только хорошо до последней секунды.

Вы можете прибегнуть к "письму дважды". Напишите один раз в основную коллекцию и снова напишите в "последнюю обновленную" коллекцию. Без транзакций это будет не идеально, но только с одним элементом в "последней обновленной" коллекции он всегда будет быстрым.

Ответ 4

Еще один способ получить последний элемент из коллекции MongoDB (не берите в голову примеры):

> db.collection.find().sort({'_id':-1}).limit(1)

Нормальная проекция

> db.Sports.find()
{ "_id" : ObjectId("5bfb5f82dea65504b456ab12"), "Type" : "NFL", "Head" : "Patriots Won SuperBowl 2017", "Body" : "Again, the Pats won the Super Bowl." }
{ "_id" : ObjectId("5bfb6011dea65504b456ab13"), "Type" : "World Cup 2018", "Head" : "Brazil Qualified for Round of 16", "Body" : "The Brazilians are happy today, due to the qualification of the Brazilian Team for the Round of 16 for the World Cup 2018." }
{ "_id" : ObjectId("5bfb60b1dea65504b456ab14"), "Type" : "F1", "Head" : "Ferrari Lost Championship", "Body" : "By two positions, Ferrari loses the F1 Championship, leaving the Italians in tears." }

Сортированная проекция (_id: обратный порядок)

> db.Sports.find().sort({'_id':-1})
{ "_id" : ObjectId("5bfb60b1dea65504b456ab14"), "Type" : "F1", "Head" : "Ferrari Lost Championship", "Body" : "By two positions, Ferrari loses the F1 Championship, leaving the Italians in tears." }
{ "_id" : ObjectId("5bfb6011dea65504b456ab13"), "Type" : "World Cup 2018", "Head" : "Brazil Qualified for Round of 16", "Body" : "The Brazilians are happy today, due to the qualification of the Brazilian Team for the Round of 16 for the World Cup 2018." }
{ "_id" : ObjectId("5bfb5f82dea65504b456ab12"), "Type" : "NFL", "Head" : "Patriots Won SuperBowl 2018", "Body" : "Again, the Pats won the Super Bowl" }

sort({'_id':-1}), определяет проекцию в порядке убывания всех документов на основе их _id.

Сортированная проекция (_id: обратный порядок): получение последнего (последнего) документа из коллекции.

> db.Sports.find().sort({'_id':-1}).limit(1)
{ "_id" : ObjectId("5bfb60b1dea65504b456ab14"), "Type" : "F1", "Head" : "Ferrari Lost Championship", "Body" : "By two positions, Ferrari loses the F1 Championship, leaving the Italians in tears." }

Ответ 5

php7.1 mongoDB:
$data = $collection->findOne([],['sort' => ['_id' => -1],'projection' => ['_id' => 1]]);

Ответ 6

Мое решение:

db.collection("name of collection").find({}, {limit: 1}).sort({$natural: -1})

Ответ 7

Если вы используете автоматически сгенерированные идентификаторы объектов Mongo в своем документе, он содержит метку времени в качестве первых 4 байтов, по которым можно найти последний документ, вставленный в коллекцию. Я понимаю, что это старый вопрос, но если кто-то все еще останавливается здесь в поисках еще одной альтернативы.

db.collectionName.aggregate(
[{$group: {_id: null, latestDocId: { $max: "$_id"}}}, {$project: {_id: 0, latestDocId: 1}}])

Выше запрос даст _id для последнего документа, вставленного в коллекцию