我想基于我构造的正则表达式查询MongoDB文档.例如,我构建了一个简单的正则表达式,如下所示,它是Nodejs中随机字母和随机数的组合
var randnum = Math.floor((Math.random() * 10) + 1);
var alpha = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','X','Y','Z'];
var randletter = alpha[Math.floor(Math.random() * alpha.length)];
var val = randletter + randnum + '.*;
Run Code Online (Sandbox Code Playgroud)
我已尝试过各种正则表达式变量的组合
var stream = collection.find({"FirstName": /val/).stream();
&&
var stream = collection.find({"FirstName": /$val/).stream();
&&
var stream = collection.find({"FirstName": {$in : [{$regex:val}]}}).stream()
&&
var stream = collection.find({"FirstName": {$in : [{$regex:$val}]}}).stream()
Run Code Online (Sandbox Code Playgroud)
没有它似乎工作.但是当我写实际的正则表达式时,我得到了例如的记录
var stream = collection.find({"FirstName": /J.*/).stream();
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激.
谢谢Ganesh
Joh*_*yHK 34
您需要使用RegExp构造函数从字符串创建正则表达式对象,因为/.../语法仅用于文字.
var stream = collection.find({"FirstName": new RegExp(val)}).stream();
Run Code Online (Sandbox Code Playgroud)
我的标题存在相同的问题,经过大量搜索,我在这里找到了这个答案,
var search = 'Joe';
db.users.find(name: /^search/)
db.users.find(name: {$regex: /^search/});
db.users.find(name: {$regex: "/^" + search + "/"});
Run Code Online (Sandbox Code Playgroud)
上面的查询不会返回任何内容。这个小问题的解决方案非常简单:
db.users.find(name: new RegExp(search)) //For substring search, case sensitive.
db.users.find(name: new RegExp('^' + search + '$')) //For exact search, case sensitive
db.users.find(name: new RegExp(search? ‘i')) //For substring search, case insensitive
db.users.find(name: new RegExp('^' +search + '$', 'i')); //For exact search, case insensitive
Run Code Online (Sandbox Code Playgroud)
其他标志或属性可以根据参考添加到此处
如果您的正则表达式包含变量,请确保对其进行转义。
function escapeRegExp(string) {
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
}
Run Code Online (Sandbox Code Playgroud)
可以像这样使用
new RegExp(escapeRegExp(searchString), 'i')
Run Code Online (Sandbox Code Playgroud)
或者在像这样的 mongoDb 查询中
{ '$regex': escapeRegExp(searchString) }
Run Code Online (Sandbox Code Playgroud)
在这里发表了相同的评论
小智 6
使用以下代码在regex中使用动态值或使用操作
{$match: { $or: [{ 'title': { $regex: request.query.val, $options: 'i'} }, { 'skills_required': { $regex: request.query.val, $options: 'i'} }] }},
Run Code Online (Sandbox Code Playgroud)
如果要将变量val用作查询部分的参数,则可以使用$ regex,例如:
collection.find({"FirstName": {$regex:val}})
Run Code Online (Sandbox Code Playgroud)
根据手册,不允许将$ regex放在$ in运算符中。
如果要将正则表达式对象放在$ in运算符中,则必须使用JavaScript正则表达式对象,例如:
collection.find({"FirstName": {$in: [/abc/, /123/]}})
Run Code Online (Sandbox Code Playgroud)
顺便说一句,val in /val/是常量字符串,而不是上面定义的变量。
| 归档时间: |
|
| 查看次数: |
17675 次 |
| 最近记录: |