2011-11-18 9 views
14

में एक या खंड का उपयोग करके मोंगोडीबी मैं मोंगोडीबी से पूछताछ करने के लिए पाइथन के मोंगोएन्गिन का उपयोग कर रहा हूं, और इसे अधिकांश भाग के लिए पसंद किया है, लेकिन मुझे advanced query के साथ कोई समस्या है।मोंगोएन्गिन

यहाँ मेरी मॉडल

class ContentItem(Document): 
    account = ReferenceField(Account) 
    creator = ReferenceField(User) 
    public = BooleanField(default=False) 
    last_used = DateTimeField(default=datetime.now) 

मैं सभी ContentItem की है कि एक विशेष खाते के हैं के लिए एक प्रश्न करना चाहते हैं, और या तो उपयोगकर्ता के प्रवेश या सार्वजनिक द्वारा बनाई गई हैं है। क्वेरी मैं

query = ContentItem.objects.filter((Q(account=account) & Q(public=True)) | (Q(account=account) & Q(creator=logged_in_user))).order_by('-last_used') 

या लिखा है:

query = ContentItem.objects.filter(Q(account=account) & (Q(public=True) | Q(creator=logged_in_user))).order_by('-last_used') 

लेकिन इन XOR होने लगते हैं जहां यदि या तो public, या creator लेकिन दोनों नहीं। क्या यह उम्मीद है?

क्या मैं कुछ देख रहा हूं? क्या मुझे इसे सीधे मोंगोएन्गिन के बजाय मोंगोडब के साथ करना चाहिए?

मेरा वर्तमान कामकाज दो अलग-अलग प्रश्नों को बनाने और परिणामों को गठबंधन करना है, लेकिन जैसे ही सामग्री आइटम # बड़ा हो जाता है, परिणामस्वरूप वापस आने में काफी समय लग रहा है क्योंकि मुझे ऑर्डर करने से पहले सभी वस्तुओं को प्राप्त करने की आवश्यकता है, इस प्रकार (django) अंकुरित परिणामों के सभी लाभ खोना।

उत्तर

6

इस मामले में मोंगोएन्गिन दस्तावेज स्पष्ट रूप से गलत है। Bitwise ऑपरेटरों का उपयोग करने के बजाय "&" और "|", आपको मानक ऑपरेटरों "और" और "या" का उपयोग करना चाहिए।

तो आपका पहला प्रश्न बन जाता है:

query = ContentItem.objects.filter((Q(account=account) and Q(public=True)) or (Q(account=account) and Q(creator=logged_in_user))).order_by('-last_used') 
+0

कि चाल किया आयात कर रहे हैं। मैंने दस्तावेज को ठीक करने के लिए github खाते पर एक नोट जोड़ा https://github.com/hmarr/mongoengine/issues/363 – MattoTodd

+0

यह मामला नहीं है; उपरोक्त संदर्भित जिथब मुद्दे देखें। मैंने कोशिश की, लेकिन '|' के बजाय 'या' का उपयोग करके फ़िल्टर लागू नहीं होगा। '&' और '|' का उपयोग करना मेरे लिए ठीक काम करता है। – Paul

+2

@ पॉल - शायद आपने यह नहीं देखा कि यह पोस्ट 9 महीने का था, और बग को ठीक कर दिया गया है? – apiguy

2

क्वेरी करने के लिए सही तरीका है बिटवाई ऑपरेशंस | औरका उपयोग करेंजिस तरह से आप अपने प्रश्न में यह लिखा है:

query = ContentItem.objects.filter((Q(account=account) & Q(public=True)) | (Q(account=account) & Q(creator=logged_in_user))).order_by('-last_used') 

नोट: मानक अजगर बूलियन ऑपरेटरों and और orनहीं काम करेगा का उपयोग कर। यह MongoEngine documentation में समझाया गया है।

0

आप शायद गलत क्यू

from mongoengine.queryset.visitor import Q as mongo_Q

from django.db.models import Q as normal_Q