使用数组的MongoDB正则表达式搜索

问题描述:

我正在寻找一个逻辑来从数据库中检索数据从1000个记录。我不能在应用程序级别做。使用数组的MongoDB正则表达式搜索

我有结尾两个双胞胎字母,如“ll,gg,ss,ff ...”的数据。想要检索以上述来自DB的双字符结束的单词。

我的样品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', 'G-G', 'LL', 'SS'];

关于如何将其作为数据库级别进行操作的任何想法。由于应用程序级别循环有近10万条记录,因此应用级循环时间长,花费时间更长。

您可以use the $in with regular expression通过创建RegExp对象的一个​​新的数组如下与$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运营商,包括像这样的checkarray管道分隔正则表达式:

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

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

因此,对于您后续问题

我需要它结束的checkArray的信件,而不是在 中间或启动的话。 CheckArray字符应该以字符串 结尾。像“蛋”而不是“装”

你可以去像这样:

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" } 
]) 

以上查询将返回文件_id s 1和3.

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

真棒。正常工作感谢您的快速响应。小变化。我需要在中间或起始处以checkArray的字母结尾的单词。 CheckArray字符应该以字符串结尾。像“EGG”而不是“FILLED”,寻求帮助。@chridam –

+0

@ user1099855我已经用该解决方案更新了我的答案。 – chridam

+0

完美,工作正常 –