具有以列表中指定的前缀开头的属性的对象的MongoEngine查询列表

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)

有任何想法吗?

Fil*_*vić 9

如果您查询某个术语的值,则可以过滤以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)