Node.js 如何在MongoDB查询中使用regex变量

Node.js 如何在MongoDB查询中使用regex变量,node.js,mongodb,Node.js,Mongodb,我想基于我构造的正则表达式对文档进行查询MongoDB。例如 我已经构建了一个简单的正则表达式,如下所示,它是一个随机字母和一个随机数的组合 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 randlett

我想基于我构造的正则表达式对文档进行查询MongoDB。例如 我已经构建了一个简单的正则表达式,如下所示,它是一个随机字母和一个随机数的组合

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 + '.*;
我已经尝试过正则表达式变量的各种组合,比如

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()
似乎没用。然而,当我编写实际的正则表达式时,我会得到例如

var stream = collection.find({"FirstName": /J.*/).stream();
任何帮助都将不胜感激

谢谢
Ganesh

如果要使用变量val作为查询部分的参数,可以使用$regex,例如:

collection.find({"FirstName": {$regex:val}})
collection.find({"FirstName": {$in: [/abc/, /123/]}})
根据手册,不允许将$regex放入$in操作符中

如果要将正则表达式对象放入运算符中的$in,则必须使用JavaScript正则表达式对象,例如:

collection.find({"FirstName": {$regex:val}})
collection.find({"FirstName": {$in: [/abc/, /123/]}})

顺便说一句,
/val/
中的val是常量字符串,而不是上面定义的变量。

您需要使用
RegExp
构造函数从字符串创建正则表达式对象,因为
/…/
语法仅用于文本

var stream = collection.find({"FirstName": new RegExp(val)}).stream();

使用以下代码在带有或操作的正则表达式中使用动态值

{$match: { $or: [{ 'title': { $regex:  request.query.val, $options: 'i'} }, { 'skills_required': { $regex:  request.query.val, $options: 'i'} }] }},

我的标题也有同样的问题,经过多次搜索,我找到了这个答案

上面的查询不会返回任何内容。这个小问题的解决方法非常简单:

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
可以根据此处的引用添加其他标志或属性

let test = `what your regex should 
search`;

collection.find({
    fieldName: {$regex: test}
}).then(result => red.send(result));

//在mongoose上测试过,但也应该在mongodb上工作

如果您的正则表达式包含变量,请确保它

这个可以这样使用

new RegExp(escapeRegExp(searchString), 'i')
{ '$regex': escapeRegExp(searchString) }
或者在像这样的mongoDb查询中

new RegExp(escapeRegExp(searchString), 'i')
{ '$regex': escapeRegExp(searchString) }

发布了相同的评论

向导,谢谢。但是,这似乎不起作用。var stream=collection.find({“FirstName”:{$regex:val}}).stream();stream.on(“data”,function(item)results.push(item);发生任何错误,或者没有得到预期的结果?存储在数据库中的文档示例可能会有所帮助。JohnnyHK-效果非常好。我所做的更改是var val=randletter+“*”+randnum+”;var stream=collection.find({“FirstName”:new RegExp(val)}).stream();谢谢GaneshI尝试了您的建议,但似乎不起作用。我要做的是,让pattern='/^\/'+cat+'/';col.find({name:new RegExp(pattern)})其中cat是一个变量,我正在连接它的值以创建匹配模式。从
模式
中删除
/
字符,它就会工作。@AvaniKhabiyaHi-谢谢。但它不工作-var val=randletter+randnum+'.''''';var stream=collection.find({“FirstName”:{$regex:val})。stream当做Ganesh@TinniamV.Ganesh,数据库中FirstName的值是多少?或者可能没有任何项可以满足您的查询需要?向导-FirstName只是一个字母和数字字符串。我尝试了几次,它总是返回一个空集。另一个版本var stream=collection.find({“FirstName”:new RegExp(val)})。stream()工作了。无论如何谢谢。问候Ganesh@TinniamV.Ganesh,谢谢您的回复。我想我错过了一些关于您不支持$regex的情况的详细信息。
db.users.find(名称:{$regex:“/^”+search+“/”})
正是我所需要的,使用
/
它不起作用。就像在这个例子中:
var name='.*+user.name+'.*'found=db.users.findOne({'name':{$regex:name}})
我正是在寻找db.users.find(name:new RegExp('^'+search+'$,'I'));谢谢..Hamza:我在
不区分大小写
精确搜索
方面遇到了一个问题。我添加的规则如下{name:new RegExp('^'+search+'$',I')}。问题是,当我搜索
测试时…
(使用点,这是我需要的,因为有带点的条目),我得到了结果,
test123
test333
等等…我怎么才能只得到条目
test…