MongoDB检查列表中的多个正则expression式匹配自由文本search

我build立了一个mongoDB数据库,允许(简单)使用多键的关键字search这里推荐。 logging看起来也很相似:

{ title: { title: "A river runs through", _keywords: ["a","river","runs","through"] ) , ... } 

我使用nodejs服务器端,所以我使用JavaScript。 以下查询将匹配(这是在mongoterminal中运行):

 > db.torrents_sorted.find({'title._keywords' : {"$all" : ["river","the"]} }).count() 210 

但是,这些不:

 > db.torrents_sorted.find({'title._keywords' : {"$all" : ["/river/i","/the/i"]} }).count() 0 > db.torrents_sorted.find({'title._keywords' : {"$all" : [{ "$regex" : "river", "$options" : "i" },{ "$regex" : "the", "$options" : "i" }]} }).count() 0 

使用单个正则expression式(不使用$和$或全部)匹配:

db.torrents_sorted.find({'title._keywords':{“$ regex”:“river”,“$ options”:“i”}})。count()1461

有趣的是,使用python和pymongo编译正则expression式是行不通的:

 >>> db.torrents_sorted.find({'title._keywords': { '$all': [re.compile('river'), re.compile('the')]}}).count(); 236 

我不一定要寻找一个使用正则expression式的解决scheme,但需要关键字匹配较短的string,所以“riv”匹配“河”,这似乎是理想的正则expression式(或SQL中的LIKE)。

我的下一个想法是尝试传递一个在列表上执行正则expression式匹配的javascript函数,或者为每个正则expression式传递一个单独的函数(这看起来似乎尖叫了我:),尽pipe我猜测这将是速度较慢,性能非常重要。

您可能想要使用$和运算符。

好吧,我有一个答案,这是一个有趣的不同的方式。 我在MongoDB 1.8版本中遇到的错误已经解决了, 这里显示了这个错误 。

可悲的是,托pipe公司的数据库atm无法提供2.0版本,$和关键字被添加到版本2.0,虽然感谢debugging帮助Samarth。

所以相反,我写了一个JavaScript函数来执行正则expression式匹配:

 function () { var rs = [RegExp(".*river.*"), RegExp(".*runs.*")]; for(var j = 0; j < rs.length; j++) { var val = false; for (var i = 0; !val && i < this.title._keywords.length; i++) val = rs[j].test(this.title._keywords[i]); if(!val) return false; } return true; } 

这运行在O(n ^ 2)时间(不是很酷),但会失败的线性时间,如果第一个正则expression式不匹配任何关键字(因为我正在寻找一个disjunction)。

任何关于优化的意见都将不胜感激,尽pipe如果这是我能find的1.8的最佳解决scheme,我可能不得不在其他地方find其他地方来存储我的分贝。