Отримайте останні записи з колекції mongodb


99

Я хочу знати останні записи в колекції. Як це зробити?

Примітка. Я знаю, що такі запити командного рядка працюють:

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

де ідате додано часову позначку.

Проблема в тому, що збір довший - це час повернути дані, і моя "тестова" колекція дійсно величезна. Мені потрібен запит з постійною реакцією на час.

Якщо є кращий запит командного рядка mongodb, повідомте мене.

Відповіді:


138

Це повторна відповідь попередньої відповіді, але, швидше за все, це буде працювати в різних версіях mongodb.

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

10
db.collection.find().limit(1).sort({$natural:-1}).pretty()якщо ви хочете, щоб це виглядало добре
Ентоні

Отже, яка різниця в цьому порядку:db.collection.find().sort({$natural:-1}).limit(1).pretty()
Лев

@ Дигітати, який вплив на продуктивність матиме він, якщо ми поставимо обмеження в кінці, а також про те, як буде отримано останню запис, коли ви обмежуєте вихід лише одним документом, і він повинен бути головним документом у колекції.
kailash yogeshwar

Гарна відповідь. Я спробував так: db.collection ("назва колекції"). Find ({}, {limit: 1}). Sort ({$ natural: -1})
Abdul Alim Shakir

Для тих , хто з допомогою AWS DocDB: Query failed with error code 303 and error message 'option $natural is not supported' on server docdb. Сподіваємось, ця функція з’явиться незабаром.
Марк

34

Це дасть вам останній документ для collection

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

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

Редагувати : Для всіх нижніх версій синтаксис мангуста, синтаксис монго CLI:db.collectionName.find({}).sort({$natural:-1}).limit(1)


7
Здається, ваш синтаксис неправильний. Я не можу змусити його працювати так, як у вас є. Що працює: 'db.punchdeck.findOne ({$ query: {}, $ orderby: {$ natural: -1}})'
Дейв Лоурер

не впевнений, чому всі голоси - цей код ідеально працює для мене, і це швидко
dark_ruby

2
@dark_ruby Ви запиту повертаєте помилку "$ err": "Неможливо канонізувати запит: BadValue Непідтримуваний параметр проекції: сортування: {$ natural: -1.0}",
Роман Підлінов

20

Мені потрібен запит з постійною реакцією на час

За замовчуванням індекси в MongoDB - це B-Дерева. Пошук B-дерева - це операція O (logN), тому навіть find({_id:...})не даватиме відповіді на постійний час, O (1).

Зазначене, ви також можете сортувати, _idякщо ви використовуєте ObjectIdдля себе ідентифікатори. Детальніше дивіться тут . Звичайно, навіть це добре лише до останньої секунди.

Ви можете вдатися до "написання двічі". Напишіть один раз до основної колекції і знову напишіть до "останнього оновленого" зібрання. Без транзакцій це не буде ідеально, але лише з одним предметом у колекції "Останнє оновлення" це завжди буде швидко.


2
Я бачу чимало рішень noSQL та MongoDB, які виступають "писати двічі", в основному для власників підрахунків, коли розмір даних стає дуже великим. Я здогадуюсь, що це звичайна практика?
Вінні

MongoDB не переливається на диск дуже часто і не має транзакцій, тому запис стає значно швидшим. Тут є те, що вам пропонується знецінити дані, що часто призводить до декількох записів. Звичайно, якщо ви отримуєте 10-кратну або 100-кратну пропускну спроможність запису (яку я бачив), то 2x або 3x запис все ще є великим поліпшенням.
Гейтс VP

13

Ще один спосіб отримати останній предмет із колекції 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." }

2

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



0

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

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

Вище запит дасть _id для останнього документа, вставленого в колекцію


0

Ось як отримати останній запис із усіх документів 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/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.