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()它时,它会返回与您的查询匹配的文档。

因此,通过以下查询,您将获得一个文档数组(Post 对象),其标签mongodb位于数组 field 中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 回答