मानगो में "कैसे अशक्त नहीं है" के लिए आप क्वेरी कैसे करते हैं?


410

मैं निम्नलिखित प्रश्न पर अमल करना चाहूंगा:

db.mycollection.find(HAS IMAGE URL)

सही सिंटैक्स क्या होना चाहिए?


74
संक्षिप्त उत्तर: नॉट{ field : {$ne : null} } -नल डॉक्स के
manual

जवाबों:


812

यह "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})

12
डॉक्स के अनुसार, $ne ऐसे दस्तावेज़ शामिल हैं जिनमें फ़ील्ड शामिल नहीं है । क्या आपने जवाब पोस्ट करने के बाद इसे बदल दिया है? docs.mongodb.org/manual/reference/operator/query/ne
एंड्रयू माओ

2
मुझे विश्वास नहीं है कि बदल गया है। $ Ne की जाँच करते समय, सभी दस्तावेज़ों में मान की जाँच की जाती है, जिसमें फ़ील्ड शामिल नहीं है, लेकिन $ ne: null अभी भी एक दस्तावेज़ से मेल नहीं खाता है जिसमें फ़ील्ड शामिल नहीं है क्योंकि फ़ील्ड का मान अभी भी शून्य है, हालांकि उस दस्तावेज़ में फ़ील्ड मौजूद नहीं है।
टिम गौटियर

2
आप दूसरे दस्तावेज़ से कैसे मेल खाते हैं?
बीटी

1
@ जब मैंने 3 साल पहले यह लिखा था, तो मैंने यह सुनिश्चित किया था कि, मैं बस मानगो स्थापित करूं और इसे फिर से आजमाऊं। यह अभी भी उसी तरह काम करता है, जवाब सही है। 2 से अंतिम क्वेरी केवल 1 दस्तावेज़ देता है।
टिम गौटियर 16

1
दिए गए उदाहरणों से यह समझ में आता है कि इसका उपयोग कैसे किया जाता है। :-)
एरिक डेला क्रूज़

92

एक लाइनर सबसे अच्छा है:

db.mycollection.find({ 'fieldname' : { $exists: true, $ne: null } });

यहाँ,

mycollection : अपना इच्छित संग्रह नाम रखें

फ़ील्डनाम : अपना इच्छित फ़ील्ड नाम रखें

व्याख्या:

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

$ ne उन दस्तावेज़ों का चयन करता है जहाँ फ़ील्ड का मान निर्दिष्ट मान के बराबर नहीं है। इसमें ऐसे दस्तावेज़ शामिल हैं जिनमें फ़ील्ड शामिल नहीं है।

तो आपके प्रदान किए गए मामले में क्वेरी के बाद सभी दस्तावेज इमेजल फील्ड के साथ मौजूद हैं और शून्य मान नहीं है:

db.mycollection.find({ 'imageurl' : { $exists: true, $ne: null } });

11
$exists: trueबेमानी है, $ne: nullपर्याप्त है।
स्टैनिस्लाव कारखानोव

यह सबसे अच्छा जवाब होना चाहिए। मान भी $exists: trueदेता nullहै। दोनों $exists: trueऔर होना है $ne: null। यह बेमानी नहीं है।
इस्माइल कट्टकथ

47

Pymongo में आप उपयोग कर सकते हैं:

db.mycollection.find({"IMAGE URL":{"$ne":None}});

क्योंकि pymongo "null" के रूप में mongo "null" का प्रतिनिधित्व करता है।


18
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"})

संदर्भ


14

भविष्य के पाठकों के लिए साझा करना।

यह क्वेरी हमारे लिए काम करती है ( MongoDB कम्पास से निष्पादित क्वेरी ):

{
  "fieldName": {
    "$nin": [
      "",
      null
    ]
  }
}

1
{$ मौजूद है: सही, $ ne: null} ने सही परिणाम नहीं दिखाया। आपकी क्वेरी अच्छे से काम करती है
ऑलेक्ज़ेंडर बुचेक

1
सावधान रहें, $
Nin

4
db.<collectionName>.find({"IMAGE URL":{"$exists":"true"}, "IMAGE URL": {$ne: null}})

क्या यह एक वैध Json दस्तावेज है? क्वेरी दस्तावेज़ में एक ही नाम के साथ दो गुण। सुनिश्चित नहीं हैं कि आप उस मेमोरी में कैसे निर्माण करेंगे अगर आपको करना था।
ब्रेंट आर

4

एक आदर्श मामले में, आप तीनों मानों के लिए परीक्षण करना चाहेंगे , अशक्त , "" या रिक्त (रिकॉर्ड में फ़ील्ड मौजूद नहीं है)

आप निम्नलिखित कर सकते हैं।

db.users.find({$and: [{"name" : {$nin: ["", null]}}, {"name" : {$exists: true}}]})

3

एक विकल्प जिसका उल्लेख नहीं किया गया है, लेकिन यह कुछ के लिए एक अधिक कुशल विकल्प हो सकता है (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 लौटाएगा), इसलिए कृपया उचित होने पर ही उपयोग करें।


पाठ क्षेत्र हमेशा विरल सूचकांक होते हैं, आपको यह स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता नहीं है। बस मेरे 2 सेंट।
अलियनोस-

3

मोंगो कम्पास में कॉलम के अस्तित्व की जांच करने का सबसे सरल तरीका है:

{ 'column_name': { $exists: true } }

1
इसके साथ समस्या यह है कि यह मानता है कि क्षेत्र को कभी भी बरकरार नहीं रखा गया था, लेकिन ओपी को लगता है कि यह (शीर्षक से) इंगित करता है कि यह मौजूद हो सकता है लेकिन स्पष्ट रूप से अशक्त होने के लिए तैयार है।
कैरिघन

-10

क्वेरी होगी

db.mycollection.find({"IMAGE URL":{"$exists":"true"}})

यह "IMAGE URL" वाले सभी दस्तावेजों को एक कुंजी के रूप में लौटाएगा ...........


1
@ किलियानाक यह सच नहीं है। $ मौजूद है, साथ ही अशक्त-मूल्यों को पकड़ लेगा। Docs.mongodb.org/manual/reference/operator/query/exists
dorvak

@ डोरवाक वास्तव में, इसीलिए यह प्रश्न में उपयोग के मामले को संतुष्ट नहीं करेगा।
किलियन

यह उत्तर गलत है क्योंकि $existsकुंजी के लिए जाँच करता है "IMAGE URL"और इसके मूल्य ( null) पर विचार नहीं करता है और इसके साथ एक दस्तावेज़ लौटाएगा "IMAGE URL" : null
डेविड हरीरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.