无法使用mongoengine查询ListField

时间:2012-11-02 23:47:12

标签: python django mongodb mongoengine

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

我的模特:

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

查询:

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

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

1 个答案:

答案 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