Dapatkan rekor terbaru dari koleksi mongodb

99

Saya ingin mengetahui rekor terbaru dalam sebuah koleksi. Bagaimana cara melakukannya?

Catatan: Saya tahu kueri baris perintah berikut berfungsi:

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

di mana idate memiliki stempel waktu ditambahkan.

Masalahnya adalah semakin lama koleksi tersebut adalah waktu untuk mendapatkan kembali data dan koleksi 'tes' saya sangat besar. Saya butuh pertanyaan dengan respons waktu yang konstan.

Jika ada permintaan baris perintah mongodb yang lebih baik, beri tahu saya.

inkriti
sumber

Jawaban:

138

Ini adalah pengulangan dari jawaban sebelumnya tetapi lebih mungkin untuk bekerja pada versi mongodb yang berbeda.

db.collection.find().limit(1).sort({$natural:-1})
Digit
sumber
10
db.collection.find().limit(1).sort({$natural:-1}).pretty()jika Anda ingin terlihat bagus
Anthony
Jadi, apa bedanya dengan urutan ini:db.collection.find().sort({$natural:-1}).limit(1).pretty()
Leo
@Digits apa dampak kinerja jika kita menempatkan batas di akhir juga bagaimana catatan terakhir diambil ketika Anda membatasi keluaran hanya untuk satu dokumen dan itu harus menjadi dokumen teratas dalam koleksi.
kailash yogeshwar
Jawaban bagus. Saya mencoba seperti ini: db.collection ("nama koleksi"). Find ({}, {limit: 1}). Sort ({$ natural: -1})
Abdul Alim Shakir
Untuk siapa saja yang menggunakan AWS DocDB: Query failed with error code 303 and error message 'option $natural is not supported' on server docdb. Semoga fitur itu segera hadir.
Marc
34

Ini akan memberi Anda satu dokumen terakhir untuk a collection

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

$natural:-1 berarti urutan kebalikan dari yang record dimasukkan.

Sunting : Untuk semua downvoters, di atas adalah sintaks Mongoose, sintaks mongo CLI adalah:db.collectionName.find({}).sort({$natural:-1}).limit(1)

dark_ruby
sumber
7
Sintaks Anda sepertinya salah. Saya tidak bisa membuatnya bekerja seperti yang Anda miliki. Apa yang berhasil adalah: 'db.punchdeck.findOne ({$ query: {}, $ orderby: {$ natural: -1}})'
Dave Lowerre
tidak yakin, mengapa semua suara negatif - kode ini bekerja dengan sempurna untuk saya, dan cepat
dark_ruby
2
@dark_ruby Kueri Anda mengembalikan kesalahan "$ err": "Tidak dapat mengkanonikalisasi kueri: BadValue Opsi proyeksi yang tidak didukung: sort: {$ natural: -1.0}",
Roman Podlinov
20

Saya butuh pertanyaan dengan respons waktu yang konstan

Secara default, indeks di MongoDB adalah B-Trees. Pencarian B-Tree adalah operasi O (logN), jadi bahkan find({_id:...})tidak akan memberikan respon waktu, O (1) konstan.

Yang menyatakan, Anda juga dapat mengurutkan berdasarkan _idjika Anda menggunakan ObjectIduntuk Anda ID. Lihat di sini untuk detailnya . Tentu saja, bahkan itu hanya bagus sampai detik terakhir.

Anda mungkin menggunakan "menulis dua kali". Tulis sekali ke koleksi utama dan tulis lagi ke koleksi "terakhir diperbarui". Tanpa transaksi, ini tidak akan sempurna, tetapi hanya dengan satu item dalam koleksi "terakhir diperbarui", ini akan selalu cepat.

Gates VP
sumber
2
Saya melihat banyak solusi noSQL dan MongoDB menganjurkan "menulis dua kali", kebanyakan untuk pemegang hitungan ketika ukuran datanya menjadi sangat besar. Saya menduga ini adalah praktik umum?
Vinny
MongoDB tidak terlalu sering di-flush ke disk dan tidak ada transaksi, jadi penulisan menjadi jauh lebih cepat. Imbalannya di sini adalah Anda didorong untuk menormalisasi data yang sering menyebabkan banyak penulisan. Tentu saja, jika Anda mendapatkan throughput tulis 10x atau 100x (yang pernah saya lihat), maka penulisan 2x atau 3x masih merupakan peningkatan besar.
Gates VP
13

Cara lain untuk mendapatkan item terakhir dari Koleksi MongoDB (jangan pedulikan contohnya):

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

Proyeksi Normal

> 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." }

Proyeksi yang Diurutkan (_id: urutan terbalik)

> 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}), mendefinisikan proyeksi dalam urutan menurun dari semua dokumen, berdasarkan _ids.

Proyeksi yang Diurutkan (_id: urutan terbalik): mendapatkan dokumen terbaru (terakhir) dari koleksi.

> 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.dll
sumber
2

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

Sam
sumber
1

Solusi Saya:

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

Abdul Alim Shakir
sumber
0

Jika Anda menggunakan Id Objek Mongo yang dibuat secara otomatis di dokumen Anda, ini berisi stempel waktu di dalamnya karena 4 byte pertama yang menggunakan dokumen terbaru yang dimasukkan ke dalam koleksi dapat ditemukan. Saya mengerti ini adalah pertanyaan lama, tetapi jika seseorang masih berakhir di sini mencari satu alternatif lagi.

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

Kueri di atas akan memberikan _id untuk dokumen terbaru yang dimasukkan ke dalam koleksi

Chan15
sumber
0

Ini adalah cara mendapatkan record terakhir dari semua dokumen MongoDB dari koleksi "foo". (Ubah foo, x, y .. dll.)

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

Anda dapat menambah atau menghapus dari grup

artikel bantuan: https://docs.mongodb.com/manual/reference/operator/aggregation/group/#pipe._S_group

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

ssymbiotik
sumber