8

我正在使用 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 个对象)。

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

4

3 回答 3

19

是的,MongoDB 支持正则表达式。您可以在文档中阅读它。这是一个例子:

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

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

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

请注意,正则表达式很慢并且扩展性很差。搜索时间与集合中的记录数成线性关系,只有当您的正则表达式以字符串开头的锚点^(谢谢,chx)开头时,索引才有帮助。

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

更新: MongoDB 2.4 有一个新的实验性文本索引功能,允许使用索引加速文本搜索。

更新 2:从 2.6 版开始,默认启用文本搜索并准备好进行生产使用。

于 2012-11-30T08:48:15.423 回答
2
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.*"}}');

这解决了我的问题

于 2012-11-30T13:44:01.050 回答
0

MongoDB Compass中,没有一个提议的解决方案有效,但我已经成功完成了以下查询:

使用 RegExp 对象:

{email: RegExp('@gmail.com$', 'i')}

或像这样的电子邮件开头foo.bar

{ "email" : /^foo.bar.*/ }

或像这样包含以下内容的电子邮件@gmail

{ "email" : /.*@gmail.*/ }
于 2020-05-22T10:40:52.880 回答