2012-11-02 12 views
5

साथ ListField क्वेरी करने मैं mongoengine उपयोग कर रहा हूँ, और मैं निम्नलिखित स्थिति है,मुसीबत mongoengine

मेरे मॉडल:

class Item(Document): 
    ... 
    tags = ListField(StringField(max_length=30)) 

क्वेरी:

filters = { 
    'tags__contains': query 
} 
tags_with_counter = Item.objects.filter(**filters).item_frequencies('tags') 

यह एक रिटर्न टैग के नाम और आवृत्ति वाले tuples की सूची। मैं जो करना चाहता हूं वह केवल टैग प्राप्त करता है जिसमें क्वेरी और उनकी संबंधित आवृत्ति शामिल है। मैं उसे कैसे कर सकता हूँ?

+0

क्या आप इस क्वेरी के अंतिम लक्ष्य/उपयोग-मामले का अधिक विस्तार से वर्णन कर सकते हैं? क्या चुनने के लिए टैग का एक सीमित सेट है? क्या आप केवल दस्तावेजों वाले दस्तावेज़ों की गिनती चाहते हैं? उपर्युक्त item_frequencies क्वेरी आपकी आवश्यकताओं के लिए पर्याप्त क्यों नहीं है? –

उत्तर

10

होने इस समान MongoEngine मॉडल और दस्तावेजों:

class Post(Document): 
    title = StringField() 
    tags = ListField(StringField()) 

post1 = Post(title='Fun with MongoEngine', tags=['mongodb', 'mongoengine']).save() 
post2 = Post(title='Loving Mongo', tags=['mongodb']).save() 

आप इस संग्रहीत करेंगे:

{ 
    "tags": [ "mongodb", "mongoengine" ], 
    "title": "Fun with MongoEngine" 
} 
{ 
    "tags": [ "mongodb" ], 
    "title": "Loving Mongo" 
} 

MongoDB में, जब आप कर एक find() यदि दस्तावेजों आपकी क्वेरी से मिलान, उन लौटा दी जाएगी ।

तो जब निम्न क्वेरी, आपको सरणी टैग में mongodb वाले दस्तावेज़ों (पोस्ट ऑब्जेक्ट्स) की एक सरणी मिल जाएगी। (वास्तव में 'टैग' सरणी में रिक्त स्ट्रिंग के साथ शामिल हो गए और अगर मान 'MongoDB' शामिल मिलान किया जाता है):

Post.objects(tags__contains='mongodb') 

तो आप आइटम प्राप्त करने के बाद (filter सिर्फ वस्तुओं निर्माता के उपनाम है) आवृत्तियों, आपको केवल अपनी रुचि रखने वाले लोगों को प्राप्त करने की आवश्यकता होगी।

tag_cloud = Post.objects(tags__contains='mongodb').item_frequencies('tags') 

> print tag_cloud 
{'mongodb': 2, 'mongoengine': 1} 
> tag_cloud['mongodb'] 
2 
संबंधित मुद्दे