我正在寻找一种逻辑来从1000多个记录中检索数据库中的数据。我不能在应用程序级别。
我的数据以两个双字母结尾,例如“ ll,gg,ss,ff ...”。想要从数据库中检索以上述双字符结尾的单词。
我的样本数据库:
[{
"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万条记录,因此应用程序级循环的效率很高,并且花费更多时间。
您可以通过创建一个新的RegExp对象数组来将$ in与正则表达式结合使用,如下所示:$in
var checkarray = ['ll','gg','ll','ss'],
regex = checkarray.map(function (k) { return new RegExp(k); });
db.collection.find({
"word": { "$in": regex }
})
请记住,使用$in
较小的数组可能会非常有效,但使用庞大的列表则不会那么有效,因为它会在索引中跳过以查找匹配的文档,或者在没有索引的情况下遍历整个集合。
除了将$ in与正则表达式一起使用外,您还可以将$regex
运算符与包含checkarray的管道分隔正则表达式模式一起使用,如下所示:
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" }
])
上面的查询将返回带有_id
s 1和3的文档。
{ "_id" : 1, "word" : "well" }
{ "_id" : 3, "word" : "glass" }
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句