Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 属性以列表中指定的前缀开头的对象的MongoEngine查询列表_Python_Mongodb_Mongoengine_Nosql - Fatal编程技术网

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

Python 属性以列表中指定的前缀开头的对象的MongoEngine查询列表,python,mongodb,mongoengine,nosql,Python,Mongodb,Mongoengine,Nosql,我需要查询Mongo数据库中具有以列表中任何前缀开头的特定属性的元素。现在我有一段代码如下: query = mymodel(terms__term__in=query_terms) 这将匹配在列表“terms”中有一个项的对象,该项的StringField“term”显式出现在列表“query\u terms”中。我想要实现的是让对象在列表“terms”中有一个条目,该条目的StringField“term”以列表“query\u terms”中出现的任何前缀开头。是否可以在一个查询中完成,

我需要查询Mongo数据库中具有以列表中任何前缀开头的特定属性的元素。现在我有一段代码如下:

query = mymodel(terms__term__in=query_terms)
这将匹配在列表“terms”中有一个项的对象,该项的StringField“term”显式出现在列表“query\u terms”中。我想要实现的是让对象在列表“terms”中有一个条目,该条目的StringField“term”以列表“query\u terms”中出现的任何前缀开头。是否可以在一个查询中完成,而不在数据库中存储“term”的所有可能前缀? 编辑: 下面的解决方案非常有效,但现在我必须找到以列表中每个前缀开头的术语的对象。我变了

query = reduce(lambda q1, q2: q1.__or__(q2), 
           map(lambda prefix: Q(terms__term__startswith=prefix)))

但这是行不通的。我最终得到以下错误:

InvalidQueryError: Duplicate query conditions: terms__term__startswith

有什么想法吗?

您可以使用正则表达式,如
^(prefix1 | prefix2等)


upd:没有注意到这个问题是关于mongoengine的。以上内容适用于纯pymongo,不知道我是否允许这样做。

如果您查询某个术语的值,您可以过滤以perfix开头的值,如下所示:

MyModel.objects.filter(terms__term__startswith='foo')
如果需要筛选多个前缀,则必须为此创建Q对象:

MyModel.objects.filter(Q(terms__term__startswith='foo') | Q(terms__term__startswith='bar'))
如果需要动态创建查询,请执行以下操作:

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)
MyModel.objects.filter(Q(terms__term__startswith='foo') | Q(terms__term__startswith='bar'))
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)