2012-04-27 12 views
6

मुझे उन तत्वों के लिए मोंगो डेटाबेस से पूछताछ करने की आवश्यकता है जिनके पास सूची में किसी भी उपसर्ग के साथ शुरू होने वाली एक निश्चित संपत्ति है। अब मैं इस तरह कोड का एक टुकड़ा है:सूची में निर्दिष्ट उपसर्गों से शुरू होने वाली प्रॉपर्टी वाले गुणों के लिए मोंगोइंजिन क्वेरी सूची

query = mymodel(terms__term__in=query_terms) 

और इस वस्तुओं एक सूची "शब्द" है कि StringField "शब्द" पर एक आइटम है कि स्पष्ट रूप से एक सूची "QUERY_TERMS" पर होने वाली मेल खाता है। मैं जो हासिल करना चाहता हूं वह ऐसी ऑब्जेक्ट्स है जिसमें एक सूची "शर्तों" पर एक आइटम है जिसमें स्ट्रिंगफ़िल्ल्ड "टर्म" है जो किसी भी उपसर्ग के साथ शुरू होता है जो "query_terms" सूची में होता है। क्या यह एक प्रश्न में और डाटाबेस में "टर्म" के हर संभव उपसर्ग को संग्रहीत किए बिना करना संभव है? संपादित करें: नीचे समाधान बहुत अच्छा काम करता है लेकिन अब मुझे सूची में प्रत्येक उपसर्ग से शुरू होने वाली शर्तों के साथ वस्तुओं को ढूंढना होगा। मैं

query = reduce(lambda q1, q2: q1.__and__(q2), 
      map(lambda prefix: Q(terms__term__startswith=prefix))) 

को

query = reduce(lambda q1, q2: q1.__or__(q2), 
      map(lambda prefix: Q(terms__term__startswith=prefix))) 

बदल लेकिन यह काम नहीं करता। मुझे निम्न त्रुटि मिल रही है:

कोई विचार?

उत्तर

9

अपने एक शब्द में जानना चाहते हैं, तो यह मान के लिए, आप मूल्यों कि इतने तरह एक perfix के साथ शुरू फ़िल्टर कर सकते हैं:

MyModel.objects.filter(terms__term__startswith='foo') 

आप एक से अधिक उपसर्गों के लिए फिल्टर करने के लिए की जरूरत है आप के लिए क्यू वस्तुओं बनाना होगा कि:

MyModel.objects.filter(Q(terms__term__startswith='foo') | Q(terms__term__startswith='bar')) 

आप गतिशील क्वेरी बनाने के लिए की जरूरत है:

prefixes = ['foo', 'bar', 'baz'] 
query = reduce(lambda q1, q2: q1.__or__(q2), 
       map(lambda prefix: Q(terms__term__startswith=prefix), prefixes)) 
MyModel.objects.filter(query) 
+0

धन्यवाद, यह आसान से मैंने सोचा है और बहुत अच्छा काम करता है! –

+0

धन्यवाद @min मैंने आपका संपादन जोड़ा है। –

2

आप ^(prefix1 | prefix2 etc) तरह रेगुलर एक्सप्रेशन का उपयोग कर सकते हैं:

prefixes = [....] 
regex = '^(%s)' % '|'.join(map(re.escape, prefixes)) 
docs = your_collection.find({'term': {'$regex': regex}}) 

upd: नोटिस नहीं किया था इस सवाल mongoengine बारे में है। उपरोक्त शुद्ध पिमोंगो के लिए है, मुझे नहीं पता कि क्या मैं इसे अनुमति देता हूं।

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

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