千家信息网

MongoDB中regex如何使用

发表于:2025-02-23 作者:千家信息网编辑
千家信息网最后更新 2025年02月23日,MongoDB中regex如何使用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Part1:写在最前使用MySQL或其他
千家信息网最后更新 2025年02月23日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安全错误 数据库的锁怎样保障安全 哪个数据库可以检索中华医学会 哪些属于有线传输网络技术 鼓楼区网络安全 软件开发人员职责 广州爱浦路网络技术有限公司招聘 控制网络技术的工作内容 软件开发8大模型 mc多人游戏服务器刷新不出来 女生报事业单位网络技术员 如何获取dnf服务器 公路网络安全应急处置预案 平台软件开发需要会什么 黄山市网络安全应急指挥中心 关于中小学生网络安全意识 保障网络安全使用的技术手段 一台存储接多台服务器 虹口区软件开发解决方案 江阴通用软件开发项目信息 吐鲁番网络技术参数 计算机网络技术模拟测试卷一 对数据库的认识 数据库动态表创建删除 张家港数据网络技术包括什么 计算机网络技术可以报考监理员吗 网络安全主持人致词 自动化专业做软件开发 服务器填x41518 国象数据库 监狱网络安全培训计划 软件开发培训那些学校靠谱
0