使用Array进行MongoDB正则expression式search

我正在寻找一个逻辑来从数据库中检索数据从1000个logging。 我不能在应用程序级别做。

我有数据结尾两个双胞胎字母,如“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万条logging,因此应用级循环时间长,花费时间更长。

您可以使用正则expression式使用$ in,方法是创build一个RegExp对象的新数组,以便与$inexpression式一起使用,如下所示:

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

请记住,使用$in对于小数组可能相当有效,但对于巨大的列表来说使用相当有效,因为它将在索引中跳过以查找匹配的文档,或者在没有使用索引的情况下遍历整个集合。


除了在正则expression式中使用$ in之外,还可以使用包含checkarray的pipe道分隔正则expression式模式的$regex运算符,如下所示:

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

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

所以,你的后续问题

我需要checkArray的字母结尾,而不是在中间或开始。 CheckArray字符应该在string的结尾。 像“蛋”而不是“填充”

你可以这样做:

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

为了testing这个,将这些示例文档填充到testing集合中:

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