2012-06-06 17 views
53

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

नोट: मैं जानता हूँ कि निम्नलिखित कमांड लाइन काम करता है प्रश्नों:

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

जहां idate टाइमस्टैम्प है जोड़ा।

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

यदि कोई बेहतर mongodb कमांड लाइन क्वेरी है, तो मुझे बताएं।

उत्तर

17

मैं लगातार समय प्रतिक्रिया

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

यह कहा गया है कि आप _id द्वारा भी सॉर्ट कर सकते हैं यदि आप आईडी के लिए ObjectId का उपयोग कर रहे हैं। See here for details। बेशक, यह भी पिछले दूसरे के लिए अच्छा है।

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

+2

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

+0

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

14

यह आपको एक collection

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

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

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

+6

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

+0

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

+1

@dark_ruby आप क्वेरी रिटर्न त्रुटि "$ गलती ":" क्वेरी को कैनोलिकल नहीं कर सकता: BadValue असमर्थित प्रोजेक्शन विकल्प: सॉर्ट करें: {$ प्राकृतिक: -1.0} ", –

78

यह पिछले उत्तर का एक रिहाश है लेकिन यह अधिक होने की संभावना है विभिन्न mongodb संस्करणों पर ओर्क।

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

' db.collection.find()। सीमा (1) .sort ({$ natural: -1}) .pretty() 'अगर आप इसे अच्छे लगाना चाहते हैं – Antoine

+0

तो, इस आदेश के साथ क्या अंतर है:' 'db.collection.find()। क्रमबद्ध करें ({$ प्राकृतिक: -1})। सीमा (1)। सुंदर() '' ' – Leo

+0

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

-1

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

0

मेरे समाधान:

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

संबंधित मुद्दे