2012-11-02 12 views
5

とListFieldをを照会:トラブル私はmongoengineを使用している、と私は、次のような状況を持っている、</p> <p>マイモデルmongoengine

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

クエリ:

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

これは、Aを返しますタグの名前を含むタプルのリスト、および頻度。私がしたいのは、クエリとそれぞれの頻度を含むタグだけです。どうやってやるの?

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() 

あなたは、この保存されます::あなたはfind()文書が検索キーワードに一致しなければとき、それらが返されるのMongoDBでは、

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

この同様のMongoEngineモデルとドキュメントを持つ

+0

このクエリの最終目標/使用例をより詳しく説明できますか?選択できる有限のタグがありますか?クエリを含むタグを含むドキュメントの数を欲しいだけですか?上記のitem_frequenciesクエリがあなたのニーズに十分でないのはなぜですか? –

答えて

10

したがって、次のクエリでは、配列タグに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 
関連する問題