在MongoDB文档中搜索带有特殊字符的字符串

时间:2013-05-15 08:32:43

标签: mongodb

我想在文档中搜索具有特殊字符的值,例如" $ / . @ > "

让我们考虑一下,我的myKey值为"test$australia", "test$austria", "test$belgium", "green.africa".

我想用'.*$aus.*',

搜索值

例如,

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

OR

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

以上查询不起作用,我该如何形成查询? 我正在使用MongoDB 2.4.1。

7 个答案:

答案 0 :(得分:14)

您必须通过$逃避\

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

答案 1 :(得分:3)

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(" }

答案 2 :(得分:1)

您可以使用:

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

答案 3 :(得分:1)

转义所有正则表达式特殊字符:

  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 :(得分:0)

您可以使用https://www.npmjs.com/package/regex-escape。这是一个很好的库,可以转义要在正则表达式中使用的特殊字符

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

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


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

答案 5 :(得分:0)

re.escape函数下定义搜索键,它将解决特殊字符正则表达式的问题。

{search_field: {"$regex": '{}.*'.format(re.escape(search_key)),"$options": 'i'}}

答案 6 :(得分:0)

https://stackoverflow.com/a/52322010/8208083的Java等效项如下:

Pattern p = Pattern.compile("[\\.\\*\\+\\?\\^\\${}\\(\\)|\\]\\[\\\\]");
Matcher m = p.matcher(searchKeyword);
searchKeyword = m.replaceAll("\\\\$0");

当您需要在Spring的@Query注释中传递搜索关键字时,这很有用。