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.

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})

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)


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.


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

2

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



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


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/

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.