2010-01-05 19 views
35

के साथ क्वेरी तो मेरे पास एक एम्बेडेड दस्तावेज़ है जो समूह सदस्यता ट्रैक करता है। प्रत्येक एम्बेडेड दस्तावेज़ में किसी अन्य संग्रह, एक प्रारंभ तिथि, और वैकल्पिक की समाप्ति तिथि में समूह को इंगित करने वाला एक आईडी है।मोंगोडीबी क्वेरी 'या' स्थिति

मैं एक समूह के मौजूदा सदस्यों के लिए पूछना चाहता हूं। "वर्तमान" का अर्थ है कि प्रारंभ समय वर्तमान समय से कम है, और समाप्ति समय वर्तमान समय या शून्य से अधिक है।

यह सशर्त क्वेरी पूरी तरह से मुझे अवरुद्ध कर रही है। मैं इसे दो प्रश्नों को चलाकर और परिणामों को विलय करके कर सकता था, लेकिन यह बदसूरत लगता है और एक ही समय में सभी परिणामों में लोडिंग की आवश्यकता है। या मैं दूर भविष्य में कुछ मनमानी तारीख के लिए समय समाप्त कर सकता हूं, लेकिन यह भी बदसूरत और संभावित भंगुर लगता है। एसक्यूएल में मैं इसे "(expires> = Now()) के साथ व्यक्त करता हूं या (आईएस न्यूल की अवधि समाप्त हो जाता है)" - लेकिन मुझे नहीं पता कि मोंगो में ऐसा कैसे किया जाए।

कोई विचार? अग्रिम में ही बहुत शुक्रिया।

+0

अनुरूप प्रश्न: http://stackoverflow.com/questions/1945577

के मामले या कथन में, यह इस

एसक्यूएल की तरह दिखता है/तार्किक-या-दो-अलग-फ़ील्ड-इन-जहां-क्वेरी-इन-मोंगोड –

उत्तर

66

बस सोचा कि मैं भविष्य में इस पृष्ठ पर किसी भी मामले में ठोकर खाऊंगा। 1.5.3 के रूप में, मोंगो अब कोई वास्तविक $ या ऑपरेटर का समर्थन करता है: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24or

की आपकी क्वेरी "(समाप्त हो रहा है> = अब()) या (समाप्त हो रहा IS NULL)" अब के रूप में प्रदान किया जा सकता है:

{$or: [{expires: {$gte: new Date()}}, {expires: null}]} 
2

Query objects in Mongo by default AND expressions together. Mongo currently does not include an OR operator for such queries, however there are ways to express such queries.

उपयोग "में" या "जहाँ"।

db.mycollection.find({ $where : function() { 
return (this.startTime < Now() && this.expireTime > Now() || this.expireTime == null); } }); 
+0

बहुत अच्छा, पहली बार मुझे मोंगो के साथ उपयोग किया जाने वाला फ़ंक्शन दिखाई देता है !! निश्चित रूप से नकारात्मक, मुझे लगता है कि यह इंडेक्स का उपयोग नहीं करेगा – Nico

1

एक $ जहां क्वेरी धीमी गति से हो जाएगा, भाग में, क्योंकि यह अनुक्रमित उपयोग नहीं कर सकते का उपयोग करना:

इसका वाला कुछ इस तरह हो। इस तरह की समस्या के लिए मुझे लगता है कि "समाप्ति" फ़ील्ड के लिए उच्च मूल्य को स्टोर करना बेहतर होगा जो स्वाभाविक रूप से हमेशा से अधिक होगा()। आप या तो भविष्य में लाखों साल की एक बहुत ही लंबी तारीख स्टोर कर सकते हैं, या कभी भी संकेत देने के लिए एक अलग प्रकार का उपयोग नहीं कर सकते हैं। क्रॉस-प्रकार सॉर्ट ऑर्डर http://www.mongodb.org/display/DOCS/Compare+Order+for+Types पर परिभाषित किया गया है। एक खाली रेगेक्स या मैक्सकी (यदि आप भाषा का समर्थन करते हैं) दोनों अच्छे विकल्प हैं।

33

यदि कोई इसे उपयोगी पाता है, तो www.querymongo.com SQL या MongoDB के बीच अनुवाद करता है, जिसमें OR क्लॉज शामिल हैं। जब आप एसक्यूएल समकक्ष जानते हैं तो यह वाक्यविन्यास को समझने में वास्तव में सहायक हो सकता है।

SELECT * FROM collection WHERE columnA = 3 OR columnB = 'string'; 

MongoDB:

db.collection.find({ 
    "$or": [{ 
     "columnA": 3 
    }, { 
     "columnB": "string" 
    }] 
}); 
संबंधित मुद्दे