使用数组的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" }
真棒。正常工作感谢您的快速响应。小变化。我需要在中间或起始处以checkArray的字母结尾的单词。 CheckArray字符应该以字符串结尾。像“EGG”而不是“FILLED”,寻求帮助。@chridam –
@ user1099855我已经用该解决方案更新了我的答案。 – chridam
完美,工作正常 –