Lista de consultas de MongoEngine para objetos que tienen propiedades que comienzan con prefijos especificados en una lista

Necesito consultar la base de datos de Mongo para los elementos que tienen una propiedad determinada que comienza con cualquier prefijo en la lista. Ahora tengo un trozo de código como este:

query = mymodel(terms__term__in=query_terms) 

y esto hace coincidir los objetos que tienen un elemento en una lista de “términos” que tienen StringField “término” que aparece explícitamente en una lista de “query_terms”. Lo que quiero lograr es tener objetos que tengan un elemento en una lista “términos” que tengan el “término” StringField que comienza con cualquier prefijo que aparezca en la lista “query_terms”. ¿Es posible hacerlo en una consulta y sin almacenar todos los prefijos posibles de “término” en la base de datos? EDITAR: la solución a continuación funciona bien, pero ahora tengo que encontrar objetos con términos que comiencen con cada prefijo en una lista. Cambié

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

a

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

Pero esto no funciona. Termino recibiendo el siguiente error:

 InvalidQueryError: Duplicate query conditions: terms__term__startswith 

¿Algunas ideas?

Si está buscando un término para su valor, puede filtrar los valores que comienzan con un perfijo así:

 MyModel.objects.filter(terms__term__startswith='foo') 

Si necesita filtrar varios prefijos, tendrá que crear objetos Q para eso:

 MyModel.objects.filter(Q(terms__term__startswith='foo') | Q(terms__term__startswith='bar')) 

Si necesita crear la consulta dinámicamente:

 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) 

Puede usar una expresión regular como ^(prefix1 | prefix2 etc) :

 prefixes = [....] regex = '^(%s)' % '|'.join(map(re.escape, prefixes)) docs = your_collection.find({'term': {'$regex': regex}}) 

upd: no noté que esta pregunta es sobre mongoengine. Lo anterior es para pymongo puro, no sé si ME permite esto.