Поиск строки со специальными символами в документе MongoDB

Я хочу искать значения, содержащие специальные символы, такие как " $ / . @ > " в документе.

Давайте рассмотрим, у меня есть myKey со значениями, такими как "test$australia", "test$austria", "test$belgium", "green.africa".

Я хочу найти значения с помощью '.*$aus.*',

Например,

db.myCollection.find({ myKey : /.*$aus.*/i }); 

ИЛИ

db.myCollection.find({ myKey : { '$regex' : '.*$aus.*','$options' : 'i' });

Выше запросов не работает, как я должен формировать запрос? Я использую MongoDB 2.4.1.

Ответ 1

Вам нужно выйти $ на \:

db.myCollection.find({ myKey : /.*\$aus.*/i }); 
// OR
db.myCollection.find({myKey: { $regex: '.*\\$aus.*', $options: 'i'}})

Ответ 2

db.test.insert({word: 'hai('});
db.test.insert({word: 'jana'});

Результат будет таким:

{ "_id" : ObjectId("56f27fb71d843581261433c6"), "word" : "hai(" }
{ "_id" : ObjectId("56f27ffe1d843581261433c8"), "word" : "jana" }

Примечание. Хотите использовать специальную строку char, поэтому

db.test.find({word:{$regex:"\\("}});

Результат будет таким:

{ "_id" : ObjectId("56f27fb71d843581261433c6"), "word" : "hai(" }

Ответ 3

Escape всех специальных символов регулярных выражений:

  req.query.name.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');

Создайте запрос с регулярным выражением и опцией "i" (игнорировать регистр):

  const databaseQuery.name = new RegExp('${req.query.name}', 'i');

Выполните поиск по запросу:

  db.collection.find(databaseQuery)

Примечание. Не забудьте создать индексы для полей, которые вы будете искать. Поля индексирования увеличивают скорость ваших запросов в регулярном выражении. В моем случае для моего поля "имя" было бы так:

  db.collection.createIndex({ name: "text" })

Ответ 4

Вы можете использовать это:

db.myCollection.find({myKey:{ $regex:new RegExp('^' + 'test$australia'.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + '$', 'i')}})

Ответ 5

Вы можете использовать https://www.npmjs.com/package/regex-escape. Это хорошая библиотека для экранирования специальных символов для использования в регулярных выражениях

    var RegexEscape = require("regex-escape");

    let keyword = RegexEscape("{#/}");
    // => \{#\/\}


   db.myCollection.find({ myKey : { '$regex' : keyword, '$options' : 'mi' });