【问题标题】:Trouble querying ListField with mongoengine使用 mongoengine 查询 ListField 时遇到问题
【发布时间】:2012-11-02 23:47:11
【问题描述】:

我在用mongoengine,遇到以下情况,

我的模特:

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

查询:

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

这将返回一个包含标签名称和频率的元组列表。我想要做的是只获取包含 query 及其各自频率的标签。我该怎么做?

【问题讨论】:

  • 您能否更详细地描述此查询的最终目标/用例?是否有一组有限的标签可供选择?您是否只想计算带有包含查询的标签的文档数?为什么上面的 item_frequencies 查询不足以满足您的需求?

标签: python django mongodb mongoengine


【解决方案1】:

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

因此,通过以下查询,您将获得在数组字段tags 中具有标签mongodb 的文档数组(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

【讨论】:

  • 如果我需要找到任何东西?例如,如果标签是 *
猜你喜欢
  • 2019-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多