【问题标题】:MongoDB regex search with Array使用数组进行 MongoDB 正则表达式搜索
【发布时间】:2016-04-14 12:53:05
【问题描述】:

我正在寻找一种逻辑来从 1000 条记录中检索数据库中的数据。我不能在应用程序级别做。

我的数据以两个双字母结尾,例如“ll、gg、ss、ff...”。想从 DB 中检索以上述双字符结尾的单词。

我的示例数据库:

  [{
     "word": "Floss"
   }, {
    "word": "smacx"
   }, {
   "word": "fuzz"
   }, {
    "word": "grass"
   }, {
    "word": "dress"
   }, {
    "word": "puff"
   }, {
    "word": "cliff"
   }, {
    "word": "sniff"
   }, {
    "word": "chess"
   }, {
    "word": "kiss"
   }, {
    "word": "fell"
   }, {
    "word": "shell"
  }]

checkarray = ['ll','gg','ll','ss'];

关于如何作为数据库级别执行此操作的任何想法。应用程序级别的循环越来越高,并且需要更多时间,因为它有近 10 万条记录。

【问题讨论】:

    标签: node.js mongodb mapreduce sails.js


    【解决方案1】:

    您可以通过创建一个新的 RegExp 对象数组来use the $in with regular expression,以便与 $in 表达式一起使用,如下所示:

    var checkarray = ['ll','gg','ll','ss'],
        regex = checkarray.map(function (k) { return new RegExp(k); });
    db.collection.find({
        "word": { "$in": regex } 
    })
    

    请记住,使用 $in 对于小型数组可能相当有效,但对于大型列表则效果不佳,因为它会在索引中跳过以查找匹配的文档,或者遍历如果没有要使用的索引,则整个集合。


    除了using the $in with the regular expression,您还可以将$regex 运算符与包含检查数组的管道分隔正则表达式模式一起使用,如下所示:

    var checkarray = ['ll','gg','ll','ss'],
        regex = checkarray.join("|");
    db.collection.find({
        "word": {
            "$regex": regex, 
            "$options": "i"
        } 
    })
    

    要匹配最后两个字符,请使用以下模式\gg$\,即将$ 附加到$ 元字符表示字符串结尾的模式。例如,模式abc$ 可以匹配以下abc, endsinabc, 123abc, ...

    所以,对于您的后续问题

    我需要以 checkArray 字母结尾的单词,而不是在 中间或开始。 CheckArray 字符应在结束字母中 的字符串。像“EGG”而不是“FILLED”

    你可以这样做:

    var checkarray = ['ll','gg','ff','ss'],
        regex = checkarray.map(function (k) { return new RegExp(k+'$'); });
    db.collection.find({
        "word": { "$in": regex } 
    })
    

    要对此进行测试,请将这些示例文档填充到测试集合中:

    db.test.insert([
        { "_id": 1, "word" : "well" },
        { "_id": 2, "word" : "filled" },
        { "_id": 3, "word" : "glass" },
        { "_id": 4, "word" : "blessed" }
    ])
    

    上述查询将返回具有_ids 1 和3 的文档。

    { "_id" : 1, "word" : "well" }
    { "_id" : 3, "word" : "glass" }
    

    【讨论】:

    • 太棒了。工作正常感谢您的快速响应。小变化。我需要在中间或开头以 checkArray 字母结尾的单词。 CheckArray 字符应位于字符串的结尾字母中。像“EGG”而不是“FILLED”,寻求帮助。 @chridam
    • @user1099855 我已经用满足该要求的解决方案更新了我的答案。
    • 完美,工作正常
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    相关资源
    最近更新 更多