例子:
> db.stuff.save({"foo":"bar"});
> db.stuff.find({"foo":"bar"}).count();
1
> db.stuff.find({"foo":"BAR"}).count();
0
例子:
> db.stuff.save({"foo":"bar"});
> db.stuff.find({"foo":"bar"}).count();
1
> db.stuff.find({"foo":"BAR"}).count();
0
当前回答
如果查询中有一些特殊字符,则regex simple将不起作用。您需要转义这些特殊字符。
以下helper函数可以在不安装任何第三方库的情况下提供帮助:
const escapeSpecialChars = (str) => {
return str.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
}
你的问题会是这样的:
db.collection.find({ field: { $regex: escapeSpecialChars(query), $options: "i" }})
希望对大家有所帮助!
其他回答
记住前面的例子:
db.stuff.find( { foo: /bar/i } );
将导致每个包含bar的条目匹配查询(bar1, barxyz, openbar),这可能是非常危险的用户名搜索认证功能…
您可能需要使用适当的regexp语法使其仅匹配搜索项,如下:
db.stuff.find( { foo: /^bar$/i } );
有关正则表达式的语法帮助,请参阅http://www.regular-expressions.info/
db.zipcodes.find({city : "NEW YORK"}); // Case-sensitive
db.zipcodes.find({city : /NEW york/i}); // Note the 'i' flag for case-insensitivity
假设你想在“表”中搜索“列”,并且你想进行不区分大小写的搜索。最有效的方法是:
//create empty JSON Object
mycolumn = {};
//check if column has valid value
if(column) {
mycolumn.column = {$regex: new RegExp(column), $options: "i"};
}
Table.find(mycolumn);
它只是将您的搜索值添加为RegEx,并使用“i”作为选项设置的不敏感标准进行搜索。
在使用基于Regex的查询时要记住一件非常重要的事情——当您在登录系统中执行此操作时,转义正在搜索的每个字符,不要忘记^和$操作符。Lodash有一个很好的函数,如果你已经在使用它:
db.stuff.find({$regex: new RegExp(_.escapeRegExp(bar), $options: 'i'})
为什么?假设一个用户输入。*作为他的用户名。这将匹配所有用户名,只需猜测任何用户的密码就可以登录。
你可以使用正则表达式。
在你的例子中,这将是:
db.stuff.find( { foo: /^bar$/i } );
不过,我必须说,也许你可以降低(或提高)价值的过程中,而不是承担额外的成本,每次你找到它。显然,这对人名之类的东西不起作用,但可能用在像标签这样的用例上。