मोंगो: उन वस्तुओं को ढूंढें जिनके पास एक निश्चित क्षेत्र नहीं है


107

एक संग्रह में दस्तावेजों की खोज कैसे करें जो MongoDB में एक निश्चित क्षेत्र को याद कर रहे हैं?

जवाबों:


171

हाँ, $ का उपयोग करना संभव है :

db.things.find( { a : { $exists : false } } ); // return if a is missing

जब सत्य होता है, तो $ मौजूद दस्तावेज़ों से मेल खाता है, जिसमें फ़ील्ड शामिल होता है, जिसमें दस्तावेज़ शामिल हैं जहाँ फ़ील्ड मान शून्य है। यदि गलत है, तो क्वेरी केवल उन दस्तावेज़ों को वापस करती है जिनमें फ़ील्ड शामिल नहीं है।


1
चेतावनी दें, $existक्वेरीज़ इंडेक्स का उपयोग नहीं कर सकते (देखें mongodb.org/display/DOCS/… )।
थियो

4
@ थियो: MongoDB 2.0 $ से शुरू होने वाला इंडेक्स ( jira.mongodb.org/browse/SERVER-393 ) इंडेक्स का उपयोग करने में सक्षम है
दिमित्री स्केथनिकोविच

मैं इसके बाद Mongoid के लिए एक दायरे में उपयोग करने के लिए था। इस तरह दिखता है>scope :without_recommendation, :where => {:recommendation => {"$exists"=>false}}
genkilabs

50

यदि आपको परवाह नहीं है कि क्षेत्र गायब है null(या यदि यह कभी नहीं है null) तो आप थोड़ा कम और सुरक्षित उपयोग कर सकते हैं :

db.things.find( { a : null } ); // return if a is missing or null

यह सुरक्षित है क्योंकि फ़ील्ड शून्य होने $existsपर trueभी वापस आ जाएगी , जो अक्सर वांछित परिणाम नहीं होता है और इससे NPE हो सकता है।


1
हालाँकि, कोड पढ़ने वाला कोई व्यक्ति इसकी व्याख्या कर सकता है क्योंकि फ़ील्ड को समान होना चाहिए nullऔर गायब नहीं होना चाहिए । यह वास्तव में अप्रत्याशित व्यवहार है, क्योंकि आप 0(जो भी है false) के लिए ऐसा नहीं कर पाएंगे , इसलिए nullयहां अपवाद है। इसलिए, सर्वोत्तम अभ्यास अधिक पठनीय उत्तर है $exists: falseजिसका उपयोग अस्पष्ट नहीं है। याद रखें, यदि आप इसके पीछे उस टिप्पणी की जरूरत है, तो आपका थोड़ा छोटा संस्करण वास्तव में छोटा नहीं है!
यति

@Yeti मेरा लक्ष्य सभी वस्तुओं है कि खाने के लिए मान याद कर रहे हैं खोजने के लिए है अगर aक्योंकि या तो, aहै nullया क्योंकि aयाद आ रही है, तो $exists, अच्छा पर्याप्त नहीं है के रूप में यह उन मामलों में जहां पकड़ नहीं होगा aहै null
nilskp
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.