我正在使用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 :(得分:14)
拥有类似的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
中具有标记tags
的文档数组(Post对象)。 (实际上,'tag'数组用空字符串连接,如果包含值'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