迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 数据库 > MongoDB >

MongoDB 从查询开始

作者:迹忆客 最近更新:2023/05/10 浏览次数:

在这篇 MongoDB 文章中,用户将学习如何使用 $regex 开始查询。 它为查询中的模式匹配字符串提供正则表达式功能。


MongoDB 使用 $regex 开始查询

如果要使用 $regex ,请使用以下语法之一。

{ <field>: { $regex: /pattern/, $options: '<options>' } }
{ <field>: { $regex: 'pattern', $options: '<options>' } }
{ <field>: { $regex: /pattern/<options> } }

在 MongoDB 中,用户还可以使用正则表达式对象(即 /pattern/)来指定正则表达式。

{ <field>: /pattern/<options> }

用户可以使用带有以下 <options> 的正则表达式。

选项 说明
i 不区分大小写以匹配大小写。
m 对于具有多行值的字符串,在每行的开头或结尾处匹配包含锚点(例如开头为 ^ 和结尾为 $)的模式。 如果模式没有锚点或者字符串值不包含换行符(例如\n),则 m 选项无效。
x $regex 模式中的所有空白字符都将被忽略,除非它们被转义或包含在字符类中。 它还会忽略中间的字符并包含一个未转义的井号/井号 (#) 字符和后面的换行符,允许您以复杂的模式添加注释。 空白字符可能不会出现在模式的特殊字符序列中; 这仅适用于数据字符。 x 选项不影响 VT 字符的处理方式(即代码 11)。 它将需要 $regex 和 $options 语法
s 它允许点字符 (.) 匹配任何字符,包括换行符。 需要 $regex 和 $options 语法

$regex 运算符不支持全局搜索修饰符 g。

$in 表达式

只有 JavaScript 正则表达式对象(即 /pattern/)可用于将正则表达式合并到 $in 查询表达式中。 考虑以下示例。

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

在 $in 中,您不能使用 $regex 运算符表达式。

字段的隐式 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' ] } }

带有 x 和 s 的 $regex 运算符

用户应该使用 $regex 运算符和 $options 运算符来使用 x 或 s 选项。 例如,要指定 i 和 s 选项,您必须使用 $options。

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

PCRE 和 JavaScript

用户应该使用带有模式的 $regex 运算符表达式作为字符串,以在 JavaScript 中不支持的正则表达式模式中利用 PCRE 支持的功能。

例如,您必须将 $regex 运算符与模式作为字符串一起使用,以在模式中使用 (?i) 和 (?-i) 来为剩余模式打开不区分大小写。

{ name: { $regex: '(?i)a(?-i)cme' } }

$regex 和 $not

从 4.0.7 版开始,$not 运算符可以对两者执行逻辑 NOT 运算:

  1. 正则表达式对象(即 /pattern/)

    例如:

    db.inventory.find( { item: { $not: /^p.*/ } } )
    
  2. $regex 运算符表达式(从 MongoDB 4.0.7 开始)。

    例如:

    db.inventory.find( { item: { $not: { $regex: "^p.*" } } } )
    db.inventory.find( { item: { $not: { $regex: /^p.*/ } } } )
    
    在 4.0.6 及更早版本中,您可以将 $not 运算符与正则表达式对象(即 /pattern/)一起使用,但不能与 $regex 运算符表达式一起使用。

如果字段有索引,MongoDB 会根据索引中的值检查正则表达式,这比区分大小写的正则表达式查询的集合扫描更快。

如果正则表达式有一个前缀表达式,则可以进行更多优化,这表明所有可能的匹配都以确切的字符串开头。 这使 MongoDB 能够从前缀创建一个范围,并且只匹配该范围内的索引值。

如果正则表达式以脱字符号 (^) 或左锚点 (\A) 开头,后跟一串简单符号,则称为前缀表达式。 例如,正则表达式 /^abc.*/ 将通过仅匹配以 abc 开头的索引值来优化。

此外,虽然 /^a//^a.*//^a.*$/ 都匹配可比较的字符串,但它们的性能不同。

如果存在合适的索引,所有这些表达式都会使用它; 尽管如此,/^a.*//^a.*$/ 速度较慢。 匹配前缀后,/^a/ 可以停止搜索。

不区分大小写的正则表达式查询无法有效地利用索引。 例如,$regex 实现不支持排序规则,因此不能使用不区分大小写的索引。

例子:

以下示例使用名为 products 的集合和以下文档。

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

LIKE 语句

此示例匹配 ski 字段类似于“%789”的所有文档。

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

该示例类似于以下 SQL LIKE 语句。

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

不区分大小写的正则表达式匹配

以下示例使用 i 选项并对 ski 值以 ABC 开头的文档执行不区分大小写的匹配。

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

查询匹配以下文档。

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

多行匹配

m 选项在以下示例中用于匹配多行字符串中以字母 S 开头的行。

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

该查询与下面给出的以下文档相匹配。

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

如果没有 m 选项,查询将只匹配以下文档。

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

如果 $regex 模式不包含锚点,则该模式将应用于整个字符串,如以下示例所示。

db.products.find( { description: { $regex: /S/ } } )

然后,$regex 将匹配这两个文档。

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

. 匹配新行的点字符

s 选项允许点字符 (.) 匹配所有字符,包括新行,而 i 选项允许不区分大小写的匹配。

db.products.find( { description: { $regex: /m.*line/, $options: 'si' } } )

查询匹配以下文档。

{ "_id" : 102, "ski" : "xyz456", "description" : "Many spaces before     line" }
{ "_id" : 103, "ski" : "xyz789", "description" : "Multiple\nline description" }

如果没有 s 选项,查询将只匹配以下文档。

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

模式中的空白

在匹配模式中,x 选项忽略由 # 表示的空格和注释,并以 n:..

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

查询与以下文档匹配。

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

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 MongoDB Shell 中列出所有数据库

发布时间:2023/05/11 浏览次数:75 分类:MongoDB

交互式 Mongo Shell 提供了多个用于获取数据的选项。 本文介绍了在 Mongo Shell 中列出数据库的几种不同方法。

MongoDB 中检查字段包含的字符串

发布时间:2023/05/11 浏览次数:137 分类:MongoDB

这篇文章解决了如何在 MongoDB 中使用正则表达式来确定字段是否包含字符串。在 MongoDB 中使用正则表达式 正则表达式 (regex) 是定义搜索模式的文本字符串。

在 MongoDB 中 upsert 更新插入

发布时间:2023/05/11 浏览次数:162 分类:MongoDB

在 MongoDB 中,upsert 结合了更新和插入命令。 它可以在 update() 和 findAndModify() 操作中使用。MongoDB 中的 upsert 查询 upsert 采用单个布尔参数。

如何卸载 MongoDB

发布时间:2023/05/11 浏览次数:180 分类:MongoDB

要从您的计算机中卸载 MongoDB,您必须先删除 MongoDB 服务、数据库和日志文件。使用这篇 MongoDB 文章,您将能够从 Ubuntu Linux、Mac 和 Windows 卸载 MongoDB。 请务必保留数据备份,因为一旦卸载,便

在 MongoDB 中存储日期和时间

发布时间:2023/05/11 浏览次数:199 分类:MongoDB

本 MongoDB 教程解释了 Date() 对象是什么以及如何使用 Date() 方法对集合进行排序。 这也将帮助您找到在 MongoDB 中显示和存储日期/时间的最佳方法。

MongoDB 按 ID 查找

发布时间:2023/05/11 浏览次数:139 分类:MongoDB

MongoDB 中的 find by Id() 函数用于获取与用户提供的 id 相匹配的文档。 如果找不到与指定 ID 匹配的文档,则返回空值。

检查 MongoDB 服务器是否正在运行

发布时间:2023/05/11 浏览次数:127 分类:MongoDB

这篇 MongoDB 教程将告诉您如何检查是否安装了 MongoDB 以及安装的 MongoDB 服务器的版本。 它在 Windows、UBUNTU 和 MAC 等不同的操作系统中实现。

MongoDB 中的分页

发布时间:2023/05/11 浏览次数:140 分类:MongoDB

这篇文章将介绍什么是 MongoDB 中的分页。 为什么在 MongoDB 中需要分页以及在 MongoDB 中完成分页的不同方法或方式是什么。

MongoDB 中带有 OR 条件的查询

发布时间:2023/05/11 浏览次数:88 分类:MongoDB

$or 运算符用于对由两个或多个表达式组成的数组执行逻辑或运算,并仅选择或检索与数组中给定的至少一个表达式匹配的文档。MongoDB 中的 $or 运算符

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便