代码之家  ›  专栏  ›  技术社区  ›  HomerPlata

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

  •  2
  • HomerPlata  · 技术社区  · 5 年前

    我试图通过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"
        }
    ]
    

    我知道如何进行“匹配任何这些值”查询:

    var values = ['p-key', 't-key'];
    genericCollection.find({ 'key' : { $in : values}}).toArray(function (err, items) {
        res.send(items);
    });
    

    返回:

    [
        {
            "_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"
        }
    ]
    

    但是,如何将这两者结合起来,以便从以 这些数组值是多少?

    2 回复  |  直到 5 年前
        1
  •  2
  •   Wiktor Stribiżew    5 年前

    您可以从多字符字符串中构建基于交替的模式,并记住必要的分组构造(以便 ^

    new RegExp('^(?:' + values.join('|') + ')', 'i')
    

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

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

    这个 regex

    ^(?:t1|p2|mN)
    

    细节

    • ^
    • (?:t1|p2|mN) -与任何备选方案匹配的非捕获组: t1 p2 mN .
        2
  •  1
  •   mrzasa    5 年前

    [pqrst]

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