Je souhaite rechercher des valeurs comportant des caractères spéciaux tels que " $ / . @ > "
dans un document.
Considérons que j'ai myKey avec des valeurs comme "test$australia", "test$austria", "test$belgium", "green.africa".
Je veux rechercher des valeurs avec '.*$aus.*',
Par exemple,
db.myCollection.find({ myKey : /.*$aus.*/i });
OR
db.myCollection.find({ myKey : { '$regex' : '.*$aus.*','$options' : 'i' });
Les requêtes ci-dessus ne fonctionnent pas, comment dois-je former une requête?.
Vous devez échapper à $
par \
:
db.myCollection.find({ myKey : /.*\$aus.*/i });
// OR
db.myCollection.find({myKey: { $regex: '.*\\$aus.*', $options: 'i'}})
db.test.insert({Word: 'hai('});
db.test.insert({Word: 'jana'});
Sortie soit comme ça:
{ "_id" : ObjectId("56f27fb71d843581261433c6"), "Word" : "hai(" }
{ "_id" : ObjectId("56f27ffe1d843581261433c8"), "Word" : "jana" }
Remarque: vous voulez que la ligne de caractères spéciaux soit seule
db.test.find({Word:{$regex:"\\("}});
La sortie soit comme ça:
{ "_id" : ObjectId("56f27fb71d843581261433c6"), "Word" : "hai(" }
Vous pouvez utiliser ceci:
db.myCollection.find({myKey:{ $regex:new RegExp('^' + 'test$australia'.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + '$', 'i')}})
Échappe à tous les caractères spéciaux regex:
req.query.name.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
Créez une requête avec regex et option "i" (ignore case):
const databaseQuery.name = new RegExp(`${req.query.name}`, 'i');
Effectuer une recherche avec une requête:
db.collection.find(databaseQuery)
Remarque: n'oubliez pas de créer des index pour les champs dans lesquels vous allez effectuer une recherche. L'indexation des champs augmente la vitesse de vos requêtes regex . Dans mon cas, pour mon champ 'name', ce serait comme suit:
db.collection.createIndex({ name: "text" })