web-dev-qa-db-fra.com

Comment trouver une sous-chaîne dans un champ dans Mongodb

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
44
codious

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.

51
Derick

Utilisez simplement la chaîne "Star Wars" et $regex fera le reste

db.test.find({A: {$regex: 'Star Wars'}})
24

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

1
dev101