2014-05-10 6 views
5

मेरे पास एक संग्रह है जहां कुछ ऑब्जेक्ट्स में एक कुंजी foo है। अब मैं उन सभी ऑब्जेक्ट्स के लिए पूछताछ करने का प्रयास करता हूं जिनमें वास्तव में यह कुंजी है लेकिन विशिष्ट मान bar के साथ नहीं। इसके लिए मैं निम्नलिखित क्वेरी का उपयोग करता हूं:मोंगोडीबी/पायमोंगो: एकाधिक मानदंडों को क्वेरी करना - अप्रत्याशित परिणाम

collection.find({'foo': {'$exists': True}, 'foo': {'$ne': 'bar'}}) 

मैंने सोचा कि दोनों मानदंड तार्किक और कनेक्ट के माध्यम से जुड़े हुए हैं। हालांकि, मुझे ऐसी ऑब्जेक्ट भी मिलती हैं जिनमें कुंजी foo नहीं है। वास्तव में, मैं एक ही परिणाम प्राप्त जब मैं सिर्फ क्वेरी

collection.find({'foo': {'$ne': 'bar'}}) 

का उपयोग अन्य हंस, यदि मैं

collection.find({'foo': {'$exists': True}}) 

का उपयोग मैं सही ढंग से केवल foo लेकिन obvisouly उन सभी के साथ वस्तुओं मिलता है, तो उनमें से कुछ के पास मूल्य bar है।

मुझे अपना प्रारंभिक परिणाम प्राप्त करने के लिए मेरी क्वेरी कैसे तैयार करनी है? क्या कोई ऐसा आदेश है जिसमें एकाधिक मानदंडों का परीक्षण किया जाता है? क्या मैं स्पष्ट रूप से तार्किक और दोनों मानदंडों को निर्दिष्ट करता हूं?

+0

यह एक बुनियादी pymongo क्वेरी का एक बड़ा उदाहरण है। मेरी इच्छा है कि यह पहले आया जब मैं "pymongo उदाहरण उदाहरण" googled: - \। +1 –

+0

मुझे नहीं लगता कि Pymongo के लिए विशिष्ट उदाहरणों की आवश्यकता है क्योंकि वाक्यविन्यास अनिवार्य रूप से मोंगो खोल का उपयोग करते समय समान है। मैं _think_ मोंगो खोल थोड़ा और उदार है जब कीवर्ड और फ़ील्ड नामों के आसपास उद्धरण प्राप्त करने की बात आती है (उदाहरण के लिए, '{$ ne: 'bar'} 'को' {'$ ne': 'bar'} के साथ काम करना चाहिए ')। हो सकता है कि पूंजीकरण, उदाहरण के लिए, 'सत्य' भी मायने रखता है। – Christian

उत्तर

7

आप अनेक शर्तें शामिल होने के लिए $and उपयोग कर सकते हैं:

collection.find({"$and": [{"foo": {'$ne': 'bar'}}, 
          {"foo": {'$exists': True}}]}) 
+0

बिल्कुल सही, धन्यवाद! मैंने सोचा कि यदि आपके पास मानदंडों की एक सूची है, तो 'और' उनका परीक्षण करने के लिए निहित तरीके से दिया गया तरीका है। अधिकांश उदाहरण मैंने केवल '$ या' पर ध्यान केंद्रित किया, इसलिए शायद मेरी गलतफहमी। लेकिन मनमाने ढंग से जटिल परिस्थितियों का समर्थन करने के लिए, और '$ और' निश्चित रूप से बहुत सार्थक है। – Christian

7

कोई आवश्यक $and उपयोग करने के लिए है, यह भी काम करता है

db.collection.find({"foo":{"$ne":"bar", "$exists":true}}) 
+0

कूल, धन्यवाद! तो मुझे लगता है कि मेरे पास यह समस्या है क्योंकि दोनों criterea एक ही कुंजी 'foo' का संदर्भ लेते हैं। क्या दोनों समाधानों के बीच प्रदर्शन के संबंध में कोई अंतर है? – Christian

+1

प्रदर्शन बिंदु से कोई अंतर नहीं। –

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