7

私はmongoengineを使用していますが、次のような状況があります.

私のモデル:

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

クエリ:

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

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

4

1 に答える 1

17

この類似の 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したがって、次のクエリでは、配列 fieldにタグを持つドキュメント (Post オブジェクト) の配列を取得しますtags。(実際には、「tag」配列は空の文字列と結合され、値「mongodb」が含まれている場合に一致します):

Post.objects(tags__contains='mongodb')

(フィルターは、オブジェクト コンストラクターの単なるエイリアスです)

したがって、アイテムの頻度を取得したら、興味のあるものを取得する必要があります。

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

> print tag_cloud
{'mongodb': 2, 'mongoengine': 1}
> tag_cloud['mongodb']
2
于 2012-11-06T13:26:46.263 に答える