k_w*_*ski 6 python mongodb nosql mongoengine
我需要向Mongo数据库查询具有以列表中的任何前缀开头的特定属性的元素.现在我有一段这样的代码:
query = mymodel(terms__term__in=query_terms)
Run Code Online (Sandbox Code Playgroud)
这匹配列表"条款"上具有项目的对象,该列表具有明确出现在列表"query_terms"上的StringField"term".我想要实现的是拥有列表"条款"上的项目的对象,其中StringField"term"以列表"query_terms"上出现的任何前缀开头.是否可以在一个查询中执行此操作而不在数据库中存储每个可能的"term"前缀?编辑:下面的解决方案很好,但现在我必须找到条目从列表上的每个前缀开始的对象.我变了
query = reduce(lambda q1, q2: q1.__or__(q2),
map(lambda prefix: Q(terms__term__startswith=prefix)))
Run Code Online (Sandbox Code Playgroud)
至
query = reduce(lambda q1, q2: q1.__and__(q2),
map(lambda prefix: Q(terms__term__startswith=prefix)))
Run Code Online (Sandbox Code Playgroud)
但这不起作用.我最终收到以下错误:
InvalidQueryError: Duplicate query conditions: terms__term__startswith
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
如果您查询某个术语的值,则可以过滤以perfix开头的值,如下所示:
MyModel.objects.filter(terms__term__startswith='foo')
Run Code Online (Sandbox Code Playgroud)
如果您需要过滤多个前缀,则必须为此创建Q对象:
MyModel.objects.filter(Q(terms__term__startswith='foo') | Q(terms__term__startswith='bar'))
Run Code Online (Sandbox Code Playgroud)
如果需要动态创建查询:
prefixes = ['foo', 'bar', 'baz']
query = reduce(lambda q1, q2: q1.__or__(q2),
map(lambda prefix: Q(terms__term__startswith=prefix), prefixes))
MyModel.objects.filter(query)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3178 次 |
| 最近记录: |