Ответ 1
Это пересмотр предыдущего ответа, но он скорее работает на разных версиях mongodb.
db.collection.find().limit(1).sort({$natural:-1})
Я хочу узнать самую последнюю запись в коллекции. Как это сделать?
Примечание. Я знаю, что следующие запросы в командной строке:
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, сообщите мне.
Это пересмотр предыдущего ответа, но он скорее работает на разных версиях mongodb.
db.collection.find().limit(1).sort({$natural:-1})
Это даст вам один последний документ для collection
db.collectionName.findOne({}, {sort:{$natural:-1}})
$natural:-1
означает порядок, противоположный тому, который вставляются записи.
Изменить. Для всех downvoters выше - синтаксис Mongoose,
Синтаксис командной строки mongo: db.collectionName.find({}).sort({$natural:-1}).limit(1)
Мне нужен запрос с постоянным ответом времени
По умолчанию индексы в MongoDB являются B-деревьями. Поиск B-Tree - это операция O (logN), поэтому даже find({_id:...})
не будет предоставлять постоянное время, O (1) ответы.
При этом вы также можете сортировать по _id
, если вы используете ObjectId
для своих идентификаторов. Подробнее см. здесь. Конечно, даже это только хорошо до последней секунды.
Вы можете прибегнуть к "письму дважды". Напишите один раз в основную коллекцию и снова напишите в "последнюю обновленную" коллекцию. Без транзакций это будет не идеально, но только с одним элементом в "последней обновленной" коллекции он всегда будет быстрым.
Еще один способ получить последний элемент из коллекции 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." }
php7.1 mongoDB: $data = $collection->findOne([],['sort' => ['_id' => -1],'projection' => ['_id' => 1]]);
Мое решение:
db.collection("name of collection").find({}, {limit: 1}).sort({$natural: -1})
Если вы используете автоматически сгенерированные идентификаторы объектов Mongo в своем документе, он содержит метку времени в качестве первых 4 байтов, по которым можно найти последний документ, вставленный в коллекцию. Я понимаю, что это старый вопрос, но если кто-то все еще останавливается здесь в поисках еще одной альтернативы.
db.collectionName.aggregate(
[{$group: {_id: null, latestDocId: { $max: "$_id"}}}, {$project: {_id: 0, latestDocId: 1}}])
Выше запрос даст _id для последнего документа, вставленного в коллекцию