如何在MongoDB的查询中使用正则表达式变量

时间:2014-11-02 13:36:54

标签: node.js mongodb

我想根据我构建的正则表达式查询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 + '.*;

我已经为正则表达式变量尝试了各种组合,如

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();

任何帮助将不胜感激。

由于 内甚

6 个答案:

答案 0 :(得分:30)

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

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

答案 1 :(得分:5)

使用以下代码在regex中使用动态值或使用

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

答案 2 :(得分:3)

我的标题遇到了同样的问题,经过大量的搜索,我找到了这个答案Here

var search = 'Joe';
db.users.find(name: /^search/)
db.users.find(name: {$regex: /^search/});
db.users.find(name: {$regex: "/^" + search + "/"});

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

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

可以根据此处的引用添加其他标志或属性

答案 3 :(得分:3)

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

function escapeRegExp(string) {
  return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
}

可以这样使用

new RegExp(escapeRegExp(searchString), 'i')

或者在像这样的 mongoDb 查询中

{ '$regex': escapeRegExp(searchString) }

发表了相同的评论here

答案 4 :(得分:2)

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

collection.find({"FirstName": {$regex:val}})

根据手册,不允许在 $ in 运算符中加入 $ regex

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

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

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

答案 5 :(得分:1)

let test = `what your regex should 
search`;

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

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