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

Tin*_*esh 12 mongodb node.js

我想基于我构造的正则表达式查询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)


Ham*_*han 9

我的标题存在相同的问题,经过大量搜索,我在这里找到了这个答案,

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)

其他标志或属性可以根据参考添加到此处

  • `db.users.find(name: {$regex: "/^" + search + "/"});` 正是我需要的 (2认同)

Sco*_*ger 8

如果您的正则表达式包含变量,请确保对其进行转义

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)


Wiz*_*ard 5

如果要将变量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/是常量字符串,而不是上面定义的变量。