MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment interroger des documents dans mongodb (pymongo) où tous les mots clés existent dans un champ ?

Envisagez d'utiliser un index de texte avec un $text rechercher . Cela pourrait être une bien meilleure solution que d'utiliser des expressions régulières. Cependant, la recherche de texte renvoie des documents basés sur un algorithme de notation, de sorte que vous pourriez obtenir des résultats qui ne contiennent pas tous les mots-clés que vous recherchez.

Si vous ne pouvez pas ou ne voulez pas ajouter d'index de texte à ce champ, l'utilisation d'une seule expression régulière serait assez pénible car vous ne connaissez pas l'ordre dans lequel ces mots apparaissent. Je ne prétends pas qu'il est impossible d'écrire, mais vous vous retrouverez avec une horrible abomination même pour les normes regex. Il serait beaucoup plus facile d'utiliser l'opérateur regex plusieurs fois en utilisant le $and opérateur.

De plus, l'utilisation d'un espace comme délimiteur échouera lorsque le mot est au début ou à la fin de la chaîne ou suivi d'un point ou d'une virgule. Utilisez le jeton de limite de mot (\b ) à la place.

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

Gardez à l'esprit qu'il s'agit d'une requête très lente, car elle exécutera ces trois expressions régulières sur chaque document de la collection. Lorsqu'il s'agit d'une requête critique pour les performances, considérez sérieusement si un index de texte ne fera vraiment pas l'affaire. À défaut, la goutte d'eau à saisir serait d'extraire tous les mots-clés du documenttextfield champ que quelqu'un pourrait rechercher (qui pourrait être chaque mot unique qu'il contient) dans un nouveau champ de tableau documenttextfield_keywords , créez un index normal sur ce champ et effectuez une recherche sur ce champ avec $all opérateur (aucune expression régulière requise dans ce cas).