Node.js查询MongoDB以返回以数组中任何值开头的所有匹配项

Node.js查询MongoDB以返回以数组中任何值开头的所有匹配项,node.js,regex,mongodb,Node.js,Regex,Mongodb,我试图通过Node.js应用程序查询MongoDB,以返回以以下数组中的任何条目开头的所有匹配项:['p'、'q'、'r'、's'、't'] 我知道如何对单个值执行“开始于”: var value = 't'; genericCollection.find({ 'key' : new RegExp('^' + value, 'i')}).toArray(function (err, items) { res.send(items); }); 返回: [ { "_

我试图通过Node.js应用程序查询MongoDB,以返回以以下数组中的任何条目开头的所有匹配项:['p'、'q'、'r'、's'、't']

我知道如何对单个值执行“开始于”:

var value = 't';
genericCollection.find({ 'key' : new RegExp('^' + value, 'i')}).toArray(function (err, items) {
    res.send(items);
});
返回:

[
    {
        "_id": "59788e1a1b4a3901c7fd5501",
        "key": "t-key",
        "value": "t-value",
        "lastModified": "2018-11-27T12:18:30.029Z"
    }
]
[
    {
        "_id": "59788e1a1b4a3901c7fd5501",
        "key": "t-key",
        "value": "t-value",
        "lastModified": "2018-11-27T12:18:30.029Z"
    },
    {
        "_id": "5978ba139553e32697564d7e",
        "key": "p-key",
        "value": "p-value",
        "lastModified": "2018-11-27T12:18:55.966Z"
    }
]
我知道如何进行“匹配任何这些值”查询:

返回:

[
    {
        "_id": "59788e1a1b4a3901c7fd5501",
        "key": "t-key",
        "value": "t-value",
        "lastModified": "2018-11-27T12:18:30.029Z"
    }
]
[
    {
        "_id": "59788e1a1b4a3901c7fd5501",
        "key": "t-key",
        "value": "t-value",
        "lastModified": "2018-11-27T12:18:30.029Z"
    },
    {
        "_id": "5978ba139553e32697564d7e",
        "key": "p-key",
        "value": "p-value",
        "lastModified": "2018-11-27T12:18:55.966Z"
    }
]

但是如何将这两者结合起来,以便从数据库中获得所有以这些数组值开头的结果呢?

您可能可以使用一个名为
[pqrst]

genericCollection.find({ 'key' : new RegExp('^[pqrst]', 'i')}).toArray(function (err, items) {
    res.send(items);
});

您可以从多字符字符串构建基于替换的模式,同时牢记必要的分组构造(以便
^
可以应用于所有替换):

请注意,如果值包含特殊的正则表达式元字符,则需要正确转义:

new RegExp('^(?:' + values.map(function(x) {return x.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');}).join('|') + ')', 'i')
看起来像

^(?:t1|p2|mN)
详细信息

  • ^
    -字符串的开头
  • (?:t1 | p2 | mN)
    -与任何备选方案匹配的非捕获组:
    t1
    p2
    mN

我认为您需要
新的RegExp(“^(?:”+values.join(“|”)+”,“I”)
字符类将比可选字符(假设值大小为1)更快@mrzasa如果它们确实是单个字符,那么字符类肯定会更合适
newregexp('^['+values.map(函数(x){return x.replace(/[\]^\-]/g,\\$&');})。join('''+']','i')
。在字符类中,
]
^
\
-
将需要转义。@WiktorStribiżew感谢Wiktor,完成了任务。你能把它作为问题的答案贴出来吗?我会接受的。谢谢你的回答,它非常适合描述的问题。不过,我必须给Wiktor一个可接受的答案,因为将来我将要求数组包含多字符串的条目