รับบันทึกล่าสุดจากคอลเลกชัน mongodb


106

ฉันต้องการทราบบันทึกล่าสุดในคอลเล็กชัน ต้องทำอย่างไร?

หมายเหตุ: ฉันรู้ว่าการสืบค้นบรรทัดคำสั่งต่อไปนี้ใช้ได้ผล:

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

โดยที่ idate มีการเพิ่มการประทับเวลา

ปัญหาคือการรวบรวมอีกต่อไปคือเวลาในการเรียกคืนข้อมูลและคอลเล็กชัน 'ทดสอบ' ของฉันใหญ่มาก ฉันต้องการแบบสอบถามที่ตอบสนองเวลาคงที่

หากมีแบบสอบถามบรรทัดคำสั่ง mongodb ที่ดีกว่าโปรดแจ้งให้เราทราบ

คำตอบ:


144

นี่เป็นการทบทวนคำตอบก่อนหน้านี้ แต่มีแนวโน้มว่าจะใช้ได้กับ mongodb เวอร์ชันต่างๆ

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

13
db.collection.find().limit(1).sort({$natural:-1}).pretty()ถ้าคุณอยากให้มันดูดี
Anthony

ดังนั้นคำสั่งนี้แตกต่างกันอย่างไร:db.collection.find().sort({$natural:-1}).limit(1).pretty()
ลีโอ

@ กำหนดตัวเลขว่าจะมีผลกระทบต่อประสิทธิภาพอย่างไรหากเราวางขีด จำกัด ไว้ที่ส่วนท้ายรวมถึงวิธีการดึงข้อมูลครั้งสุดท้ายเมื่อคุณ จำกัด ผลลัพธ์ไว้เพียงเอกสารเดียวและต้องเป็นเอกสารชั้นนำในการรวบรวม
kailash yogeshwar

คำตอบที่ดี ฉันลองแบบนี้ db.collection ("name of collection"). find ({}, {limit: 1}). sort ({$ natural: -1})
Abdul Alim Shakir

สำหรับทุกคนที่ใช้ AWS Query failed with error code 303 and error message 'option $natural is not supported' on server docdbDocDB: หวังว่าฟีเจอร์นั้นจะมาเร็ว ๆ นี้
Marc

35

สิ่งนี้จะให้เอกสารสุดท้ายสำหรับไฟล์ collection

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

$natural:-1 หมายถึงลำดับตรงข้ามกับรายการที่ใส่ระเบียน

แก้ไข : สำหรับผู้ลงคะแนนทั้งหมดด้านบนเป็นไวยากรณ์แบบพังพอนไวยากรณ์ของ Mongo CLI คือ:db.collectionName.find({}).sort({$natural:-1}).limit(1)


7
ไวยากรณ์ของคุณดูเหมือนจะไม่ถูกต้อง ฉันไม่สามารถทำให้มันทำงานได้อย่างที่คุณมี ทำงานคืออะไร: 'db.punchdeck.findOne ({$ query: {}, $ orderby: {$ natural: -1}})'
Dave Lowerre

ไม่แน่ใจว่าทำไมการ
โหวตลดลง

2
@dark_ruby การค้นหาของคุณส่งกลับข้อผิดพลาด "$ err": "ไม่สามารถระบุข้อความค้นหา: BadValue Unsupported projection option: sort: {$ natural: -1.0}",
Roman Podlinov

19

ฉันต้องการแบบสอบถามที่ตอบสนองเวลาคงที่

โดยค่าเริ่มต้นดัชนีใน MongoDB คือ B-Trees การค้นหา B-Tree เป็นการดำเนินการ O (logN) ดังนั้นแม้find({_id:...})จะไม่ให้เวลาคงที่การตอบสนอง O (1)

ตามที่ระบุไว้คุณยังสามารถจัดเรียงตาม_idถ้าคุณใช้ObjectIdสำหรับรหัสของคุณ ดูรายละเอียดได้ที่นี่ แน่นอนว่าแม้จะเป็นเพียงวินาทีสุดท้ายเท่านั้น

คุณอาจใช้วิธี "เขียนสองครั้ง" เขียนหนึ่งครั้งในคอลเลกชันหลักและเขียนอีกครั้งในคอลเล็กชันที่ "อัปเดตล่าสุด" หากไม่มีการทำธุรกรรมสิ่งนี้จะไม่สมบูรณ์แบบ แต่มีเพียงรายการเดียวในคอลเล็กชัน "อัปเดตล่าสุด" จะรวดเร็วเสมอ


2
ฉันเห็นโซลูชัน noSQL และ MongoDB จำนวนมากที่สนับสนุนการ "เขียนสองครั้ง" ซึ่งส่วนใหญ่เป็นตัวนับเมื่อขนาดของข้อมูลมีขนาดใหญ่มาก ฉันเดาว่านี่เป็นเรื่องธรรมดาใช่ไหม
Vinny

1
MongoDB ไม่ล้างข้อมูลลงดิสก์บ่อยนักและไม่มีธุรกรรมดังนั้นการเขียนจึงเร็วขึ้นอย่างมาก ข้อเสียคือคุณควรยกเลิกการทำให้ข้อมูลเป็นมาตรฐานซึ่งมักจะนำไปสู่การเขียนหลายครั้ง แน่นอนว่าถ้าคุณได้รับปริมาณงานเขียน 10x หรือ 100x (ที่ฉันเคยเห็น) การเขียน 2x หรือ 3x ก็ยังคงเป็นการปรับปรุงที่ยิ่งใหญ่
Gates VP

15

อีกวิธีหนึ่งในการรับไอเท็มสุดท้ายจาก MongoDB Collection (ไม่ต้องคำนึงถึงตัวอย่าง):

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



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 Object Ids ที่สร้างขึ้นโดยอัตโนมัติในเอกสารของคุณจะมีการประทับเวลาอยู่ในนั้นเป็น 4 ไบต์แรกโดยใช้เอกสารล่าสุดที่แทรกในคอลเล็กชัน ฉันเข้าใจว่านี่เป็นคำถามเก่า แต่ถ้ามีใครยังคงมองหาทางเลือกอื่นเพิ่มเติม

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

แบบสอบถามด้านบนจะให้_idสำหรับเอกสารล่าสุดที่แทรกลงในคอลเลกชัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.