2012-06-06 3 views
53

Я хочу узнать самую последнюю запись в коллекции. Как это сделать?Получить последнюю запись из коллекции 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, сообщите мне об этом.

ответ

17

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

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

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

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

+2

Я вижу много NoSQL и MongoDB решений выступает "писать дважды", в основном для владельцев счета при размер данных становится очень большим. Я предполагаю, что это обычная практика? – Vinny

+0

MongoDB очень часто не сбрасывается на диск, и у него нет транзакций, поэтому записи становятся значительно быстрее. Компромисс заключается в том, что вам рекомендуется де-нормализовать данные, которые часто приводят к многократной записи. Конечно, если вы получаете пропускную способность записи 10x или 100x (что я видел), то 2x или 3x записи по-прежнему являются большим улучшением. –

14

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

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

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

Edit:. Для всех downvoters, выше, является Синтаксис Mongoose, mongo CLI синтаксис: db.collectionName.find({}).sort({$natural:-1}).limit(1)

+6

Ваш синтаксис кажется неправильным. Я не могу заставить его работать, как есть. Что делает работа: 'db.punchdeck.findOne ({$ query: {}, $ orderby: {$ natural: -1}}) ' –

+0

не уверен, почему все downvotes - этот код отлично работает для меня и быстро –

+1

@dark_ruby Вы запрашиваете ошибку возврата "$ err ":" Canonicalize query: BadValue Неподдерживаемая опция прогноза: sort: {$ natural: -1.0} ", –

78

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

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

' db.collection.find(). limit (1) .sort ({$ natural: -1}) .pretty() ', если вы хотите, чтобы он выглядел хорошо – Antoine

+0

Итак, какая разница с этим порядком:' '' db.collection.find(). sort ({$ natural: -1}). limit (1). pretty() '' ' – Leo

+0

@ Определяет, какое влияние на производительность будет иметь место, если в конце мы также установим ограничение по последней записи, когда вы ограничиваете вывод только одним документом, и это должен быть верхний документ в коллекции. –

-1

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

0

Мое решение:

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

Смежные вопросы