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

u3r8eeie  于 2023-06-29  发布在  Go
关注(0)|答案(7)|浏览(243)

我想在文档中搜索具有特殊字符(如" $ / . @ > ")的值。
让我们考虑一下,我有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。

qvsjd97n

qvsjd97n1#

你必须用\转义$

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

5kgi1eie2#

转义所有regex特殊字符:

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

使用regex和选项“i”(忽略大小写)创建一个查询:

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

使用查询执行搜索:

db.collection.find(databaseQuery)

注意:不要忘记为您要搜索的字段创建索引。索引字段可以提高正则表达式查询的速度。在我的例子中,我的“名字”字段应该是这样的:

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

093gszye3#

您可以使用以下命令:

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

bq9c1y664#

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

输出是这样的:

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

注:这样要单独专用字符行

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

输出如下:

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

bsxbgnwa5#

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

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

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

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

f1tvaqid6#

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

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

uxh89sit7#

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

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

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

相关问题