2012-11-02 151 views
5

我使用mongoengine,和我有以下情況,故障查詢ListField與mongoengine

我的模型:

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

查詢:

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

這會返回一個包含標籤名稱的元組列表以及頻率。我想要做的只是獲取包含查詢及其各自頻率的標籤。我怎樣才能做到這一點?

+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的文檔(Post對象)。 (實際上是「標籤」陣列加入了與空字符串和匹配,如果包含價值「的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