千家信息网

MongoDB中regex如何使用

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,MongoDB中regex如何使用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Part1:写在最前使用MySQL或其他
千家信息网最后更新 2025年11月07日MongoDB中regex如何使用

MongoDB中regex如何使用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

Part1:写在最前

使用MySQL或其他关系型数据库的朋友们都知道,使用模糊查询的用法类似于:

SELECT * FROM products WHERE sku like "%789";

本文中介绍的MongoDB中的regex就是实现类似功能的,regex为能使你在查询中使用正则表达式。本文会用简单的实例带您了解MongoDB中regex的用法~

Part2:用法

使用$regex时,有以下几种用法:

{ : { $regex: /pattern/, $options: '' } } { : { $regex: 'pattern', $options: '' } } { : { $regex: /pattern/ } }

option参数的含义:

选项含义使用要求
i大小写不敏感
m

查询匹配中使用了锚,例如^(代表开头)和$(代表结尾),以及匹配\n后的字符串


x

忽视所有空白字符

要求$regex与$option合用
s允许点字符(.)匹配所有的字符,包括换行符。要求$regex与$option合用

实战

Part1:$in中的用法

要在$in查询中包含正则表达式,只能使用JavaScript正则表达式对象(即/ pattern /)。 例如:

{ name: { $in: [ /^acme/i, /^ack/ ] } }

Warning:警告 $in中不能使用$ regex运算符表达式。

Part2:隐式and用法

要在逗号分隔的查询条件中包含正则表达式,请使用$ regex运算符。 例如:

{ name: { $regex: /acme.*corp/i, $nin: [ 'acmeblahcorp' ] } } { name: { $regex: /acme.*corp/, $options: 'i', $nin: [ 'acmeblahcorp' ] } } { name: { $regex: 'acme.*corp', $options: 'i', $nin: [ 'acmeblahcorp' ] } }

Part3:x和s选项

要使用x选项或s选项,要求$regex与$option合用。 例如,要指定i和s选项,必须使用$ options来执行以下操作:

{ name: { $regex: /acme.*corp/, $options: "si" } } { name: { $regex: 'acme.*corp', $options: "si" } }

Part4:索引的使用

对于区分大小写的正则表达式查询,如果字段存在索引,则MongoDB将正则表达式与索引中的值进行匹配,这比全表扫描更快。如果正则表达式是"前缀表达式",那么可以优化查询速度,且查询结果都会以相同的字符串开头。

正则表达式也要符合"最左前缀原则",例如,正则表达式/^abc.*/将通过仅匹配以abc开头的索引值来进行优化。

Warning:警告

1.虽然/^a/,/^a.*/和/^a.*$/匹配等效字符串,但它们的性能是不一样的。如果有对应的索引,所有这些表达式就都使用索引;不过,/^a.*/和/^a.*$/较慢。 这是因为/^a/可以在匹配前缀后停止扫描。

2.不区分大小写的正则表达式查询通常不能使用索引,$regex无法使用不区分大小写的索引。

Part5:实例

一个商品的集合中,存了以下内容

{ "_id" : 100, "sku" : "abc123", "description" : "Single line description." } { "_id" : 101, "sku" : "abc789", "description" : "First line\nSecond line" } { "_id" : 102, "sku" : "xyz456", "description" : "Many spaces before line" } { "_id" : 103, "sku" : "xyz789", "description" : "Multiple\nline description" }

如果想对该商品products集合执行一个查询,范围是sku列中的内容是789结尾的:

db.products.find( { sku: { $regex: /789$/ } } )

结合MySQL理解的话,上述查询在MySQL中是这样的SQL:

SELECT * FROM products WHERE sku like "%789";

如果想查询sku是abc、ABC开头的,且匹配时忽略大小写,可以使用i选项:

db.products.find( { sku: { $regex: /^ABC/i } } )、

查询结果为:

{ "_id" : 100, "sku" : "abc123", "description" : "Single line description." } { "_id" : 101, "sku" : "abc789", "description" : "First line\nSecond line" }

Part6:m的使用

想查询描述中是包含S开头的,且要匹配/n后的S开头的,则需要加m选项

db.products.find( { description: { $regex: /^S/, $options: 'm' } } )

返回的结果是:

{ "_id" : 100, "sku" : "abc123", "description" : "Single line description." } { "_id" : 101, "sku" : "abc789", "description" : "First line\nSecond line" }

如果不加m选项的话,返回的结果是这样的:

{ "_id" : 100, "sku" : "abc123", "description" : "Single line description." }

如果不使用^这类锚的话,那么会返回全部结果:

db.products.find( { description: { $regex: /S/ } } ) { "_id" : 100, "sku" : "abc123", "description" : "Single line description." } { "_id" : 101, "sku" : "abc789", "description" : "First line\nSecond line" }

Part7:s的使用

使用s选项来执行查询,则会让逗号. 匹配所有字符,包括换行符,下文查询了description列中m开头,且后面包含line字符串的结果:

db.products.find( { description: { $regex: /m.*line/, $options: 'si' } } ) { "_id" : 102, "sku" : "xyz456", "description" : "Many spaces before line" } { "_id" : 103, "sku" : "xyz789", "description" : "Multiple\nline description" }

如果不包含s,则会返回:

{ "_id" : 102, "sku" : "xyz456", "description" : "Many spaces before line" }

Part8:x的使用

以下示例使用x选项忽略空格和注释,用#表示注释,并以匹配模式中的\ n结尾:

var pattern = "abc #category code\n123 #item number" db.products.find( { sku: { $regex: pattern, $options: "x" } } )

查询的结果是:

{ "_id" : 100, "sku" : "abc123", "description" : "Single line description." }

可以看出,其忽略了abc与#category的空格以及#category与code的空格,实际执行的查询是sku是abc123的结果。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

查询 表达式 正则 索引 结果 字符 开头 大小 字符串 内容 前缀 空格 代表 含义 商品 实例 换行符 注释 运算符 逗号 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 软件开发国峰软件满意 用友采购订单 数据库表名 暗黑2无法连服务器 科密A1出现数据库连接失败 app软件开发解决方案工具 梦幻西游山东百花园服务器怎么进 管理信息系统数据库设计 查询人大金仓数据库版本号 配置终端访问服务器 哈利波特 哪个服务器 苹果软件开发成本 湖州服务器精密空调安装 java和数据库的连接语句 网络安全好还是web前端好 网络技术服务费税收编码 众族网络技术有限公司 成都天涯互联网络科技 党员量化积分管理软件开发 学校学校网络安全管理制度 降序排序多关键字数据库 c 数据库的编程 宕昌县有什么数据库 关于网络安全月小结 清华大学2022网络安全考研 浪潮服务器5466m5按装 济南博赛网络技术学院电话号码 数据库创建表删除约束 对于进军网络安全有什么建议 数据库中选项按钮的特点 苹果手机怎么信任软件开发
0