无法使用mongoengine查询ListField

fce*_*uti 7 python django mongodb mongoengine

我正在使用mongoengine,我有以下情况,

我的模特:

class Item(Document):
   ...
   tags = ListField(StringField(max_length=30))
Run Code Online (Sandbox Code Playgroud)

查询:

filters = {
    'tags__contains': query
}
tags_with_counter = Item.objects.filter(**filters).item_frequencies('tags')
Run Code Online (Sandbox Code Playgroud)

这将返回包含标记名称和频率的元组列表.我想要做的只是获取包含查询的标签及其各自的频率.我怎样才能做到这一点?

Gia*_* P. 16

拥有这个类似的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()
Run Code Online (Sandbox Code Playgroud)

你会存储这个:

{
  "tags": [ "mongodb", "mongoengine" ],
  "title": "Fun with MongoEngine"
}
{
  "tags": [ "mongodb" ],
  "title": "Loving Mongo"
}
Run Code Online (Sandbox Code Playgroud)

在MongoDB中,当您执行find()if文档与查询匹配时,将返回这些文档.

因此,当以下查询时,您将获得一个mongodb在数组标记中具有a的文档数组(Post对象).(实际上'tag'数组用空字符串连接,如果包含值'mongodb'则匹配):

Post.objects(tags__contains='mongodb')
Run Code Online (Sandbox Code Playgroud)

(filter只是对象构造函数的别名)

因此,在获得项目频率后,您需要获得您感兴趣的项目.

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

> print tag_cloud
{'mongodb': 2, 'mongoengine': 1}
> tag_cloud['mongodb']
2
Run Code Online (Sandbox Code Playgroud)