sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo consultar documentos en mongodb (pymongo) donde existen todas las palabras clave en un campo?

Considere usar un índice de texto con un $text buscar . Podría ser una solución mucho mejor que usar expresiones regulares. Sin embargo, la búsqueda de texto devuelve documentos basados ​​en un algoritmo de puntuación, por lo que es posible que obtenga algunos resultados que no tengan todas las palabras clave que está buscando.

Si no puede o no quiere agregar un índice de texto a este campo, usar una sola expresión regular sería bastante molesto porque no sabe el orden en que aparecen estas palabras. No pretendo que sea imposible escribir, pero terminarás con una horrible abominación incluso para los estándares de expresiones regulares. Sería mucho más fácil usar el operador regex varias veces usando $and operador.

Además, el uso de un espacio como delimitador fallará cuando la palabra esté al principio o al final de la cadena o sea seguida por un punto o una coma. Use el token de límite de palabra (\b ) en su lugar.

collection.find(
    { $and : [
              {'documenttextfield': {'$regex': '\b' +keyword1+'\b'}},
              {'documenttextfield': {'$regex': '\b' +keyword2+'\b'}},
              {'documenttextfield': {'$regex': '\b' +keyword3+'\b'}},
         ]
    });

Tenga en cuenta que esta es una consulta realmente lenta, porque ejecutará estas tres expresiones regulares en cada documento de la colección. Cuando se trata de una consulta crítica para el rendimiento, considere seriamente si un índice de texto realmente no funciona. De no ser así, la gota que colmó el vaso sería extraer cualquier palabra clave del documenttextfield campo que alguien podría buscar (que podría ser cada palabra única en él) en un nuevo campo de matriz documenttextfield_keywords , cree un índice normal en ese campo y busque en ese campo con $all operador (no se requiere expresión regular en ese caso).