我正在使用JavaScript来查询基于Mongo DB的API。
我需要根据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个对象)。
我想知道我是否应该使用正则表达式以及如何在此上下文中使用它们。感谢
答案 0 :(得分:19)
是的,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开始,默认情况下启用文本搜索,以备高效使用。
答案 1 :(得分:1)
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.*"}}');
这解决了我的问题
答案 2 :(得分:0)
在 MongoDB Compass 中,所有提议的解决方案均无效,但是我在以下查询中取得了成功:
使用RegExp对象:
{email: RegExp('@gmail.com$', 'i')}
或对于以foo.bar
开头的电子邮件这样:
{ "email" : /^foo.bar.*/ }
或对于包含以下内容的@gmail
的电子邮件这样:
{ "email" : /.*@gmail.*/ }