我想在文档中搜索具有特殊字符的值,例如" $ / . @ > "
。
让我们考虑一下,我的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。
答案 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注释中传递搜索关键字时,这很有用。