2012-11-30 218 views
7

我正在使用JavaScript来查询基于Mongo DB的API。MONGO DB Like Operator

我需要根据LIKE操作,类似的东西,结果筛选到

select * from playlist where title like '%a%' 

此刻,我把这个网址

var assetUrl = 'https://example.com/playlist?oauth_token=' + accessToken + '&account=XXX'+ '&fields={"title":true,"splash":true,"description":true,"source":true}'+ '&criteria={"title":/.*a.*/}'; 

没有成功(返回0对象)。

我想知道是否应该使用正则表达式来代替,以及如何在这种情况下使用它们。谢谢

回答

18

是的,MongoDB支持正则表达式。你可以在the documentation阅读。以下是一个示例:

db.collection.find({ url: /.*a.*/ }); 

这将查找集合中字段“url”与正则表达式匹配的所有文档。还有一个使用$ regex运算符的替代语法:

db.collection.find({ url: { $regex: ".*a.*"} }); 

请注意,正则表达式很慢并且缩放比较严重。搜索时间与集合中的记录数量成线性关系,只有当您的正则表达式以字符串开头的起点^(谢谢,chx)开始时,索引才有用。

该文档还有一个关于Full Text Search in Mongo的章节,其中建议将每个字符串拆分为单个单词的数组,以便您可以对其进行索引以便快速查找。这当然不允许搜索单词片段,但大大加快了搜索完整单词的速度。

更新:的MongoDB 2.4具有a new experimental text-index feature允许加快文本搜索与索引。

UPDATE2:作为2.6版本,文本搜索默认情况下启用,并准备用于生产。

+2

有时正则表达式是不慢:“$正则表达式使用索引只有当正则表达式有一个字符串为开头的锚(即^)”。 http://docs.mongodb.org/manual/reference/operators/ – chx

+0

谢谢@chx,我将这些信息整合到我的答案中。 – Philipp

0
var assetUrl = 'xxx.com/playlist?oauth_token=' + accessToken + '&account=xxx'+ '&fields='+escape('{"title":true,"splash":true,"description":true,"source":true}')+ '&criteria='+escape('{"title": {"$regex":".*ar.*"}}'); 

这解决了我的问题