Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在mongodb中,如何将正则表达式应用于要查询的数据库中的值?_Javascript_Node.js_Regex_Mongodb - Fatal编程技术网

Javascript 在mongodb中,如何将正则表达式应用于要查询的数据库中的值?

Javascript 在mongodb中,如何将正则表达式应用于要查询的数据库中的值?,javascript,node.js,regex,mongodb,Javascript,Node.js,Regex,Mongodb,下面是一个场景,您将电话号码作为字符串存储在mongo中。值可以是以下任意值: 987-654-3210 9876543210 (978)654-3210 所有这些数字都是一样的。我想使用一个RegExp进行搜索,它基本上会去掉所有非字母数字字符的值。使用987-654-3210搜索将返回9876543210,但仅此而已。我希望找到一个解决方案,将正则表达式应用于数据库中存储的内容,以匹配我在查询中传递的正则表达式 最后,如果这三个电话号码都在数据库中,并且用户使用这三个号码中的任何一个进行

下面是一个场景,您将电话号码作为字符串存储在mongo中。值可以是以下任意值:

  • 987-654-3210
  • 9876543210
  • (978)654-3210
所有这些数字都是一样的。我想使用一个RegExp进行搜索,它基本上会去掉所有非字母数字字符的值。使用987-654-3210搜索将返回9876543210,但仅此而已。我希望找到一个解决方案,将正则表达式应用于数据库中存储的内容,以匹配我在查询中传递的正则表达式


最后,如果这三个电话号码都在数据库中,并且用户使用这三个号码中的任何一个进行搜索,则应返回这三个号码。

您可以使用这三个正则表达式来提取3个预期组(在您的示例中为
987
654
3210
):

  • XXX-XXX-XXXX:
    /(\d{3})-(d{3})-(d{4})/g
  • XXXXXXXXX:
    /(\d{3})(\d{3})(\d{4})/g
  • (三十) XXX-XXXX:
    /\(\d{3})\ \s(\d{3})-(\d{4})/g
我们的想法是从您的输入中生成这三个组,并从这些组中生成三种格式,以
查找与这三种格式中的任何一种匹配的所有文档:

var input = "987-654-3210"; // or any of the 3 formats

var regex = [];
regex[0] = /(\d{3})-(\d{3})-(\d{4})/g;      // 987-654-3210
regex[1] = /(\d{3})(\d{3})(\d{4})/g;        // 9876543210
regex[2] = /\((\d{3})\)\s(\d{3})-(\d{4})/g; // (978) 654-3210

function getPhoneNumber(phoneNumber) {
    for (key in regex) {
        var match = regex[key].exec(phoneNumber);
        if (match) {
            return match;
        }
    }
}

var group = getPhoneNumber(input);

var filter = [];
filter[0] = group[1] + "-" + group[2] + "-" + group[3];
filter[1] = group[1] + group[2] + group[3];
filter[2] = "(" + group[1] + ") " + group[2] + "-" + group[3];

db.data.find({
    "phoneNumber": {
        "$in": filter
    }
})

您可以直接在mongodb shell中尝试它

为了澄清,我理解如何将搜索值替换为仅为数字,但是比较仅为数字的值将与数据库中包含破折号和括号的值不匹配。挑战在于能够匹配数据库中的3个值。这将帮助我开始,但我最终希望能够将模式应用于数据库中已有的内容,以便如果他们使用句点而不是破折号或类似的东西,我能够找到更多的模式。但也许仅仅限制数据在数据库中的存储方式就有助于搜索。