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).