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

103

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

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

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

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

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

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

инкрити
источник

Ответы:

141

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

db.collection.find().limit(1).sort({$natural:-1})
Цифры
источник
12
db.collection.find().limit(1).sort({$natural:-1}).pretty()если ты хочешь, чтобы это выглядело красиво
Энтони
Итак, в чем разница с этим порядком:db.collection.find().sort({$natural:-1}).limit(1).pretty()
Лев
@Digits, какое влияние на производительность будет иметь, если мы поместим ограничение в конце, а также то, как будет выбираться последняя запись, когда вы ограничиваете вывод только одним документом, и он должен быть верхним документом в коллекции.
kailash yogeshwar
Хороший ответ. Я пробовал вот так: db.collection ("название коллекции"). Find ({}, {limit: 1}). Sort ({$ natural: -1})
Абдул Алим Шакир
Для тех , кто с помощью AWS DocDB: Query failed with error code 303 and error message 'option $natural is not supported' on server docdb. Надеюсь, эта функция скоро появится.
Marc
35

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

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

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

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

dark_ruby
источник
7
Ваш синтаксис кажется неправильным. Я не могу заставить его работать так, как у вас. Что действительно работает: 'db.punchdeck.findOne ({$ query: {}, $ orderby: {$ natural: -1}})'
Дэйв Лоуэрр,
не уверен, почему все отрицательные голоса - этот код отлично работает для меня и работает быстро
dark_ruby
2
@dark_ruby Ваш запрос возвращает ошибку "$ err": "Невозможно канонизировать запрос: BadValue Неподдерживаемый параметр проекции: sort: {$ natural: -1.0}",
Роман Подлинов
20

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

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

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

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

Гейтс ВП
источник
2
Я вижу много решений noSQL и MongoDB, которые рекомендуют «писать дважды», в основном для счетчиков, когда размер данных становится очень большим. Полагаю, это обычная практика?
Vinny
MongoDB не сбрасывается на диск очень часто и в нем нет транзакций, поэтому запись становится значительно быстрее. Компромисс здесь заключается в том, что вам предлагается денормализовать данные, что часто приводит к многократной записи. Конечно, если вы получите 10-кратную или 100-кратную пропускную способность записи (что я видел), то 2-кратная или 3-кратная запись по-прежнему будет большим улучшением.
Gates VP
14

Еще один способ получить последний элемент из коллекции 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}), определяет проекцию в порядке убывания всех документов на основе их _ids.

Сортированная проекция (_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." }
ivanleoncz
источник
2

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

Сэм
источник
1

Мое решение:

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

Абдул Алим Шакир
источник
1

Вот как получить последнюю запись из всех документов MongoDB из коллекции "foo". (Изменить foo, x, y ... и т. Д.)

db.foo.aggregate([{$sort:{ x : 1, date : 1 } },{$group: { _id: "$x" ,y: {$last:"$y"},yz: {$last:"$yz"},date: { $last : "$date" }}} ],{   allowDiskUse:true  })

вы можете добавить или удалить из группы

справочные статьи: https://docs.mongodb.com/manual/reference/operator/aggregation/group/#pipe._S_group

https://docs.mongodb.com/manual/reference/operator/aggregation/last/

символиотик
источник
0

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

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

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

Чан15
источник