【问题标题】:How can I use a regex variable in a query for MongoDB如何在 MongoDB 查询中使用正则表达式变量
【发布时间】:2014-11-02 13:36:53
【问题描述】:

我想根据我构建的正则表达式对文档进行查询 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();

任何帮助将不胜感激。

谢谢 象头神

【问题讨论】:

  • 向导,谢谢。但是,这似乎不起作用.var stream = collection.find({"FirstName": {$regex:val}}).stream(); stream.on("数据", function(item) results.push(item);
  • 出现任何错误,或者只是没有得到预期的结果?存储在数据库中的文档示例可能会有所帮助。

标签: node.js mongodb


【解决方案1】:

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

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

【讨论】:

  • JohnnyHK - 效果非常好。我所做的更改是 var val = randletter + ".*" + randnum + ".*"; var stream = collection.find({"FirstName": new RegExp(val)}).stream();谢谢 Ganesh
  • 我已经尝试了您的建议,但似乎没有用。我要做的是,让 pattern = '/^\/'+ cat + '/'; col.find({name: new RegExp(pattern)}) 其中 cat 是一个变量,我将其值连接起来以创建匹配模式。
  • pattern 中删除/ 字符,它将起作用。 @AvaniKhabiya
【解决方案2】:

我的标题也有同样的问题,经过大量搜索,我找到了这个答案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

其他标志或属性可以参考这里添加

【讨论】:

  • db.users.find(name: {$regex: "/^" + search + "/"}); 正是我所需要的
  • 对我来说,使用/ 不起作用。就像在这个例子中一样:var name = '.*'+user.name+'.*' found = db.users.findOne({ 'name': {$regex: name} })
  • 我正在寻找 db.users.find(name: new RegExp('^' +search + '$', 'i'));谢谢..
  • Hamza :我遇到了 case insensitiveexact search 的问题。我添加的规则如下 {name: new RegExp('^' + search + '$' , "i")} 。问题是,当我搜索test...(带点,我需要它,因为有带点的条目)时,我得到了结果test123test333 等......我怎样才能只得到条目test...
  • 它不适用于 MongoDB。它将“搜索”作为字符串传递给变量的值。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

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

    按照手册,$regex不能放在$in运算符中。

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

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

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

    【讨论】:

    • 嗨-谢谢。但它不起作用 - var val = randletter + randnum + '.*'; var stream = collection.find({"FirstName": {$regex:val}}).stream();问候 Ganesh
    • @TinniamV.Ganesh,数据库中 FirstName 的值是多少?或者也许只是没有项目可以满足您的查询需求?
    • 向导 - 名字只是一串字母和数字。我试了几次它总是返回一个空集。另一个版本 var stream = collection.find({"FirstName": new RegExp(val)}).stream();工作。不管怎么说,还是要谢谢你。问候 Ganesh
    • @TinniamV.Ganesh,感谢您的回复。我想我错过了一些不支持 $regex 的情况的细节。
    【解决方案5】:

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

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

    可以这样使用

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

    或者在这样的 mongoDb 查询中

    { '$regex': escapeRegExp(searchString) }
    

    发表相同评论here

    【讨论】:

      【解决方案6】:
      let test = `what your regex should search`;
      
      collection.find({
          fieldName: {$regex: test}
      }).then(result => red.send(result));
      

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

      【讨论】:

        【解决方案7】:

        我的用例是STARTS WITH给定查询获取结果,下面的解决方案对我有用。

        let q = '^' + query;
        return await User.find({ name: { $regex: q, $options: 'i' } }).select('name').limit(10);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-23
          • 1970-01-01
          • 2011-11-05
          • 2017-10-11
          相关资源
          最近更新 更多