जवाबों:
यह "IMAGE URL" नामक एक कुंजी के साथ सभी दस्तावेजों को लौटाएगा, लेकिन उनके पास अभी भी एक शून्य मान हो सकता है।
db.mycollection.find({"IMAGE URL":{$exists:true}});
यह "IMAGE URL" नामक एक कुंजी और गैर-शून्य मान दोनों के साथ सभी दस्तावेज़ लौटाएगा ।
db.mycollection.find({"IMAGE URL":{$ne:null}});
डॉक्स के अनुसार, $ $ वर्तमान में एक इंडेक्स का उपयोग नहीं कर सकता है, लेकिन $ ne कर सकता है।
संपादित करें: इस उत्तर में रुचि के कारण कुछ उदाहरण जोड़ना
इन आवेषणों को देखते हुए:
db.test.insert({"num":1, "check":"check value"});
db.test.insert({"num":2, "check":null});
db.test.insert({"num":3});
यह तीनों दस्तावेज लौटाएगा:
db.test.find();
यह केवल पहला और दूसरा दस्तावेज लौटाएगा:
db.test.find({"check":{$exists:true}});
यह केवल पहला दस्तावेज़ लौटाएगा:
db.test.find({"check":{$ne:null}});
यह केवल दूसरा और तीसरा दस्तावेज लौटाएगा:
db.test.find({"check":null})
$ne
ऐसे दस्तावेज़ शामिल हैं जिनमें फ़ील्ड शामिल नहीं है । क्या आपने जवाब पोस्ट करने के बाद इसे बदल दिया है? docs.mongodb.org/manual/reference/operator/query/ne
एक लाइनर सबसे अच्छा है:
db.mycollection.find({ 'fieldname' : { $exists: true, $ne: null } });
यहाँ,
mycollection : अपना इच्छित संग्रह नाम रखें
फ़ील्डनाम : अपना इच्छित फ़ील्ड नाम रखें
व्याख्या:
$ मौजूद है : जब यह सच है, तो $ मौजूद दस्तावेज़ों से मेल खाता है जिसमें फ़ील्ड शामिल है, जिसमें दस्तावेज़ शामिल हैं जहां फ़ील्ड मान शून्य है। यदि गलत है, तो क्वेरी केवल उन दस्तावेज़ों को वापस करती है जिनमें फ़ील्ड शामिल नहीं है।
$ ne उन दस्तावेज़ों का चयन करता है जहाँ फ़ील्ड का मान निर्दिष्ट मान के बराबर नहीं है। इसमें ऐसे दस्तावेज़ शामिल हैं जिनमें फ़ील्ड शामिल नहीं है।
तो आपके प्रदान किए गए मामले में क्वेरी के बाद सभी दस्तावेज इमेजल फील्ड के साथ मौजूद हैं और शून्य मान नहीं है:
db.mycollection.find({ 'imageurl' : { $exists: true, $ne: null } });
$exists: true
बेमानी है, $ne: null
पर्याप्त है।
$exists: true
देता null
है। दोनों $exists: true
और होना है $ne: null
। यह बेमानी नहीं है।
Pymongo में आप उपयोग कर सकते हैं:
db.mycollection.find({"IMAGE URL":{"$ne":None}});
क्योंकि pymongo "null" के रूप में mongo "null" का प्रतिनिधित्व करता है।
db.collection_name.find({"filed_name":{$exists:true}});
यह दर्ज किए गए दस्तावेज़ों को प्राप्त करें, यहां तक कि यह शून्य भी है।
मेरा प्रस्ताव:
db.collection_name.find({"field_name":{$type:2}}) //type:2 == String
आप आवश्यक विशेषता के प्रकार पर जांच कर सकते हैं, यह उन सभी दस्तावेजों को लौटा देगा जिनके फ़ील्ड_नाम की पुष्टि की गई है, क्योंकि आप दर्ज किए गए प्रकार पर जांच कर रहे हैं यदि यह शून्य है, तो यह अशक्त स्थिति से मेल नहीं खाता है, इसलिए कुछ भी वापस नहीं किया जाएगा।
Nb : यदि field_name के पास एक रिक्त स्ट्रिंग है जिसका अर्थ है "", इसे वापस कर दिया जाएगा। यह उसी व्यवहार के लिए है
db.collection_name.find({"filed_name":{$ne:null}});
अतिरिक्त सत्यापन:
ठीक है, इसलिए हम समाप्त नहीं हुए हैं फिर भी हमें एक अतिरिक्त स्थिति की आवश्यकता है।
db.collection_name.
find({ "field_name":{$type:2},$where:"this.field_name.length >0"})
या
db.collection_name.
find({ "field_name":{$ne:null},$where:"this.field_name.length >0"})
भविष्य के पाठकों के लिए साझा करना।
यह क्वेरी हमारे लिए काम करती है ( MongoDB कम्पास से निष्पादित क्वेरी ):
{
"fieldName": {
"$nin": [
"",
null
]
}
}
db.<collectionName>.find({"IMAGE URL":{"$exists":"true"}, "IMAGE URL": {$ne: null}})
एक आदर्श मामले में, आप तीनों मानों के लिए परीक्षण करना चाहेंगे , अशक्त , "" या रिक्त (रिकॉर्ड में फ़ील्ड मौजूद नहीं है)
आप निम्नलिखित कर सकते हैं।
db.users.find({$and: [{"name" : {$nin: ["", null]}}, {"name" : {$exists: true}}]})
एक विकल्प जिसका उल्लेख नहीं किया गया है, लेकिन यह कुछ के लिए एक अधिक कुशल विकल्प हो सकता है (NULL प्रविष्टियों के साथ काम नहीं करेगा) एक स्पार्स इंडेक्स का उपयोग करना है ( इंडेक्स में प्रविष्टियां केवल तब मौजूद होती हैं जब क्षेत्र में कुछ होता है)। यहाँ एक नमूना डेटा सेट दिया गया है:
db.foo.find()
{ "_id" : ObjectId("544540b31b5cf91c4893eb94"), "imageUrl" : "http://example.com/foo.jpg" }
{ "_id" : ObjectId("544540ba1b5cf91c4893eb95"), "imageUrl" : "http://example.com/bar.jpg" }
{ "_id" : ObjectId("544540c51b5cf91c4893eb96"), "imageUrl" : "http://example.com/foo.png" }
{ "_id" : ObjectId("544540c91b5cf91c4893eb97"), "imageUrl" : "http://example.com/bar.png" }
{ "_id" : ObjectId("544540ed1b5cf91c4893eb98"), "otherField" : 1 }
{ "_id" : ObjectId("544540f11b5cf91c4893eb99"), "otherField" : 2 }
अब, छवि क्षेत्र पर विरल सूचकांक बनाएँ:
db.foo.ensureIndex( { "imageUrl": 1 }, { sparse: true } )
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
अब, हमेशा एक मौका होता है (और विशेष रूप से मेरे नमूने की तरह एक छोटे डेटा सेट के साथ) कि एक इंडेक्स का उपयोग करने के बजाय, मोंगोडीबी एक टेबल स्कैन का उपयोग करेगा, यहां तक कि संभावित कवर किए गए इंडेक्स क्वेरी के लिए भी। जैसा कि यह पता चला है कि मुझे यहाँ अंतर बताने का एक आसान तरीका है:
db.foo.find({}, {_id : 0, imageUrl : 1})
{ "imageUrl" : "http://example.com/foo.jpg" }
{ "imageUrl" : "http://example.com/bar.jpg" }
{ "imageUrl" : "http://example.com/foo.png" }
{ "imageUrl" : "http://example.com/bar.png" }
{ }
{ }
ठीक है, इसलिए बिना कोई अतिरिक्त दस्तावेज imageUrl
लौटाए नहीं जा रहा है, बस खाली है, वह नहीं जो हम चाहते थे। सिर्फ यह पुष्टि करने के लिए कि क्यों, एक व्याख्या करें:
db.foo.find({}, {_id : 0, imageUrl : 1}).explain()
{
"cursor" : "BasicCursor",
"isMultiKey" : false,
"n" : 6,
"nscannedObjects" : 6,
"nscanned" : 6,
"nscannedObjectsAllPlans" : 6,
"nscannedAllPlans" : 6,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"server" : "localhost:31100",
"filterSet" : false
}
तो, हाँ, ए BasicCursor
टेबल स्कैन के बराबर है, यह सूचकांक का उपयोग नहीं किया। आइए क्वेरी को बाध्य करें hint()
:
db.foo.find({}, {_id : 0, imageUrl : 1}).hint({imageUrl : 1})
{ "imageUrl" : "http://example.com/bar.jpg" }
{ "imageUrl" : "http://example.com/bar.png" }
{ "imageUrl" : "http://example.com/foo.jpg" }
{ "imageUrl" : "http://example.com/foo.png" }
और वह परिणाम है जिसकी हम तलाश कर रहे थे - केवल आबादी वाले क्षेत्र के दस्तावेज वापस कर दिए जाते हैं। यह भी केवल इंडेक्स का उपयोग करता है (यानी यह एक कवर इंडेक्स क्वेरी है), इसलिए परिणामों को वापस करने के लिए केवल इंडेक्स को मेमोरी में होना चाहिए।
यह एक विशेष उपयोग का मामला है और आम तौर पर इसका इस्तेमाल नहीं किया जा सकता (उन विकल्पों के लिए अन्य उत्तर देखें)। विशेष रूप से यह ध्यान दिया जाना चाहिए कि जैसे-जैसे चीजें खड़ी होती हैं आप count()
इस तरह से उपयोग नहीं कर सकते हैं (उदाहरण के लिए यह 6 नहीं 4 लौटाएगा), इसलिए कृपया उचित होने पर ही उपयोग करें।
मोंगो कम्पास में कॉलम के अस्तित्व की जांच करने का सबसे सरल तरीका है:
{ 'column_name': { $exists: true } }
क्वेरी होगी
db.mycollection.find({"IMAGE URL":{"$exists":"true"}})
यह "IMAGE URL" वाले सभी दस्तावेजों को एक कुंजी के रूप में लौटाएगा ...........
$exists
कुंजी के लिए जाँच करता है "IMAGE URL"
और इसके मूल्य ( null
) पर विचार नहीं करता है और इसके साथ एक दस्तावेज़ लौटाएगा "IMAGE URL" : null
।
{ field : {$ne : null} }
-नल डॉक्स के