Comment puis-je trouver tous les objets dans une base de données avec où un champ d'un objet contient une sous-chaîne?
Si le champ est A dans un objet d'une collection avec une valeur de chaîne:
Je veux trouver tous les objets dans la "base de données" db où A contient une sous-chaîne dites "abc def".
J'ai essayé:
db.database.find({A: {$regex: '/^*(abc def)*$/''}})
mais n'a pas fonctionné
MISE À JOUR
Une vraie chaîne (en unicode):
Sujet Commentaire sur Star Wars Episode III - La Revanche des Sith 1
Besoin de rechercher toutes les entrées avec Star Wars
db.test.find({A: {$regex: '^*(star wars)*$''}}) not wokring
Au lieu de cela:
db.database.find({A: {$regex: '/^*(abc def)*$/''}})
Vous devriez faire ceci:
db.database.find({A: /abc def/i })
^ * n'est pas réellement une syntaxe valide car ^ et $ sont des ancres et non quelque chose qui est répétable. Vous vouliez probablement dire ^. * Ici. Mais il n'y a pas besoin de ^. * Car cela signifie simplement "Tout jusqu'au caractère suivant" et (abc def) * signifie "0 ou plusieurs fois" abc def ", mais cela doit être à la fin de la chaîne, à cause de votre $. Le "i" à la fin est de le rendre insensible à la casse.
Utilisez simplement la chaîne "Star Wars" et $regex
fera le reste
db.test.find({A: {$regex: 'Star Wars'}})
$regex
est trop cher/lent sur les grandes collections.
Je suggère d'utiliser le cadre d'agrégation et $ indexOfCP .
db.test.aggregate([{$match:
{$expr: { $gt: [{ $indexOfCP: [ "$A", "Star Wars" ] }, -1]}}
}, {$project: {A:1}}])
Pour une recherche non sensible à la casse, vous pouvez ajouter $toUpper
au mixage et recherchez STAR WARS
.