मोंगोडब संग्रह से नवीनतम रिकॉर्ड प्राप्त करें


102

मैं एक संग्रह में सबसे हालिया रिकॉर्ड जानना चाहता हूं। उसको कैसे करे?

नोट: मुझे पता है कि निम्न कमांड लाइन क्वेरीज़ काम करती है:

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

जहां पर दोस्त को टाइमस्टैम्प जोड़ा गया है।

समस्या यह है कि संग्रह डेटा वापस पाने का समय है और मेरा 'परीक्षण' संग्रह वास्तव में बहुत बड़ा है। मुझे लगातार समय की प्रतिक्रिया के साथ एक क्वेरी की आवश्यकता है।

अगर कोई बेहतर मोंगॉडब कमांड लाइन क्वेरी है, तो मुझे बताएं।

जवाबों:


141

यह पिछले उत्तर का एक पुनर्विचार है, लेकिन यह विभिन्न मोंगोडब संस्करणों पर काम करने की अधिक संभावना है।

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

12
db.collection.find().limit(1).sort({$natural:-1}).pretty()यदि आप चाहते हैं कि यह अच्छा
एंथनी

तो, इस आदेश में क्या अंतर है:db.collection.find().sort({$natural:-1}).limit(1).pretty()
लियो

@Digits प्रदर्शन प्रभाव क्या होगा अगर हम अंत में सीमा भी रखते हैं कि पिछला रिकॉर्ड कैसे लाया जाता है जब आपके आउटपुट को केवल एक दस्तावेज़ तक सीमित किया जाता है और यह संग्रह में शीर्ष दस्तावेज़ होना चाहिए।
कैलाश योगेश्वर 16

अच्छा उत्तर। मैंने इस तरह की कोशिश की: db.collection ("संग्रह का नाम")। खोज ({}, {सीमा: 1})। सॉर्ट ({$ प्राकृतिक: -1})
अब्दुल अलीम शाकिर

एडब्ल्यूएस डॉकडीबी का उपयोग करने वाले किसी के लिए Query failed with error code 303 and error message 'option $natural is not supported' on server docdb:। उम्मीद है कि जल्द ही यह सुविधा आ जाए।
मार्क

35

यह आपको एक के लिए एक आखिरी दस्तावेज देगा collection

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

$natural:-1 का मतलब है कि रिकॉर्ड में डाला जाता है के विपरीत आदेश।

संपादित करें : सभी डाउनवोटर्स के लिए, ऊपर एक मानस सिंटैक्स है, मोंगो सीएलआई सिंटैक्स है:db.collectionName.find({}).sort({$natural:-1}).limit(1)


7
आपका सिंटैक्स गलत लगता है। मेरे पास यह काम करने के लिए नहीं मिल सकता है जैसा आपके पास है। क्या काम करता है: 'db.punchdeck.findOne ({$ क्वेरी: {}, $ ऑर्डरबी: {$ प्राकृतिक: -1}})'
डेव लोअर्रे

निश्चित नहीं है, सभी डाउनवोट्स - यह कोड मेरे लिए पूरी तरह से काम करता है, और तेज़ है
dark_ruby

2
@dark_ruby आप क्वेरी "$ गलत" लौटाते हैं: "कैनोनिकलाइज़ क्वेरी नहीं कर सकते: BadValue असमर्थित प्रक्षेपण विकल्प: सॉर्ट: {$ प्राकृतिक: -1.0}",
रोमन पॉडलिनोव

20

मुझे लगातार समय की प्रतिक्रिया के साथ एक क्वेरी की आवश्यकता है

डिफ़ॉल्ट रूप से, MongoDB में अनुक्रमणिका B-Trees हैं। बी-ट्री की खोज एक ओ (लॉगएन) ऑपरेशन है, इसलिए यहां तक ​​कि find({_id:...})निरंतर समय भी नहीं दिया जाएगा, ओ (1) प्रतिक्रियाएं।

यह कहा गया है, _idयदि ObjectIdआप आईडी का उपयोग कर रहे हैं , तो आप इसे छाँट भी सकते हैं । विवरण के लिए यहाँ देखें । बेशक, यहां तक ​​कि केवल अंतिम सेकंड के लिए अच्छा है।

आपको "दो बार लेखन" का सहारा लेना पड़ सकता है। एक बार मुख्य संग्रह में लिखें और फिर से "अंतिम अद्यतन" संग्रह में लिखें। लेनदेन के बिना यह सही नहीं होगा, लेकिन "अंतिम अपडेटेड" संग्रह में केवल एक आइटम के साथ यह हमेशा तेज रहेगा।


2
मैं बहुत सारे noSQL और MongoDB समाधान "दो बार लिखने" की वकालत करता हूं, ज्यादातर गिनती धारकों के लिए जब डेटा का आकार बहुत बड़ा हो जाता है। मुझे लगता है कि यह आम बात है?
विन्नी

MongoDB बहुत बार डिस्क को फ्लश नहीं करता है और इसका कोई लेन-देन नहीं है, इसलिए लिखना काफी तेज हो जाता है। यहां व्यापार बंद है कि आपको डेटा को सामान्य बनाने के लिए प्रोत्साहित किया जाता है जो अक्सर कई लिखता है। बेशक, अगर आपको 10x या 100x लिखना थ्रूपुट (जो मैंने देखा है), तो 2x या 3x लिखना अभी भी एक बड़ा सुधार है।
गेट्स वीपी

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}), सभी दस्तावेजों के अवरोही क्रम में एक प्रक्षेपण को परिभाषित करता है, जो उनके _idएस के आधार पर होता है ।

क्रमबद्ध प्रोजेक्शन (_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

यदि आप अपने दस्तावेज़ में ऑटो-जनरेट किए गए मैंगो ऑब्जेक्ट आईडीएस का उपयोग कर रहे हैं, तो इसमें पहले 4 बाइट्स के रूप में टाइमस्टैम्प शामिल हैं, जिनके उपयोग से संग्रह में सम्मिलित नवीनतम डॉक्टर का पता लगाया जा सकता है। मैं समझता हूं कि यह एक पुराना प्रश्न है, लेकिन यदि कोई व्यक्ति अभी भी एक और विकल्प की तलाश में यहां समाप्त हो रहा है।

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

उपरोक्त क्वेरी संग्रह में सम्मिलित नवीनतम दस्तावेज़ के लिए _id देगी


0

यह है कि "फू" संग्रह से सभी MongoDB दस्तावेजों से अंतिम रिकॉर्ड कैसे प्राप्त करें । (परिवर्तन फू, एक्स, वाई .. आदि)

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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.