Docs 菜单
Docs 主页
/
MongoDB Manual
/

MongoDB 8.0发布说明

在此页面上

  • 补丁版本
  • 平台支持更新
  • 日志记录
  • 聚合(Aggregation)
  • 安全性
  • 分片
  • 复制
  • 升级版 TCMalloc
  • 一般性变更
  • 已知问题
  • 升级程序
  • 立即下载

本页介绍 MongoDB 8.0中引入的更改和新功能。

MongoDB 8.0是一个主要版本,这意味着MongoDB Atlas和本地部署部署均支持该版本。 MongoDB 8.0包括MongoDB快速版本7.1 、 7.2和7.3中引入的更改。 本页介绍了这些快速发布和MongoDB 8中引入的更改。 0 。

要详细学习;了解主要版本和快速版本之间的差异,请参阅 MongoDB版本控制。

重要

对空字节的不正确中和可能会导致MongoDB Server中的缓冲区过度读取

在 8.0.3 之前的MongoDB 8.0 中,授权用户可能会发出经特殊设计的请求,在MongoDB Server中构造格式不正确的BSON ,从而触发崩溃或接收服务器内存缓冲区过度读取的内容。

此问题会影响MongoDB Server版本:

  • 5.0.0 - 5.0.29

  • 6.0.0 - 6.0.18

  • 7.0.0 - 7.0.14

  • 8.0.0 - 8.0.2

修复的问题:

  • SERVER-96419 不正确的空字节中和可能会导致MongoDB Server中的缓冲区过度读取

  • 所有 Jira 问题均已在 8.0.3 中关闭

  • 8.0.3 变更日志

修复的问题:

本页的其余部分介绍了MongoDB 8.0中引入的更改和新功能。

从 MongoDB 8.0 开始,新的 MongoDB Server 版本(主要版本和次要版本)支持操作系统(OS)供应商定义的最低操作系统次要版本。当操作系统供应商不再支持某个操作系统次要版本之后,MongoDB 会更新 MongoDB Server,以支持下一个操作系统次要版本。有关详细信息,请参阅 MongoDB 平台支持改进

MongoDB 8.0 支持以下最低操作系统次要版本:

  • Red Hat Enterprise Linux 8.8

  • Red Hat Enterprise Linux 9.3

  • SUSE Linux Enterprise Server 15 SP5

  • Amazon Linux 2023 版本 2023.3

从 MongoDB 8.0 开始,可以配置数据库分析器,以根据 MongoDB 处理慢操作时花费的时间(而不是慢操作的总延迟)来记录慢操作。这意味着等待锁和流量控制等因素不会影响操作是否超过慢操作阈值。

这一更改为日志记录和查询分析提供了以下改进:

  • 根据 MongoDB 处理查询时花费的时间,可以更准确地记录慢查询。

  • 查询分析工具(例如 Query Profiler、Performance Advisor 和 Search Query Telemetry)会根据 workingMillis 而不是 durationMillis 报告缓慢的操作。这一变更可以更准确地查看有问题的查询。

  • 慢查询日志包含一个指标 queues.execution.totalTimeQueuedMicros,用于衡量在执行工单上排队的时间。此指标可以帮助确定一项操作之所以缓慢,是因为它需要一些时间完成,还是因为它需要一些时间等待启动。

有关更多信息,请参阅 db.setProfilingLevel()

为数据库分析器指定过滤器时,可以根据新的 workingMillis 指标记录操作。可以根据 workingMillisdurationMillis 记录操作,并将每个指标设置为不同的阈值。

从 MongoDB 8.0 开始,可以使用 $convert 操作符执行以下转换:

  • 字符串值转换为 binData 值

  • binData 值转换为字符串值

MongoDB 8.0还包括一个新的辅助表达式$toUUID ,它提供了将字符串转换为 UUID值的简化语法。

从MongoDB 7.1开始, $queryStats阶段会返回已记录查询的统计信息。

从 MongoDB 8.0 开始,$queryStats 改进了变更流的跟踪和报告指标。有关更多信息,请参阅 $queryStats 变更流行为

从 MongoDB 8.0 开始,当计算排名时,null$denseRank$rank sortBy 操作中的缺失字段值将被同等对待。这一更改将使 denseRankrank 的行为与 $sort 一致。

从 MongoDB 8.0 开始,可查询加密支持使用 $lt$lte$gt$gte 操作符对加密字段执行范围查询。有关详细信息,请参阅可查询加密支持的操作。要允许对加密字段执行范围查询,请参阅创建加密模式

从 MongoDB 8.0 开始,可以为审核日志消息指定 OCSF 模式。OCSF 模式以与日志处理器兼容的标准化格式提供日志。

要设置用于日志消息的模式,请使用 auditLog.schema 配置文件选项。

有关 OCSF 格式的日志消息的示例,请参阅 OCSF 模式审核消息

MongoDB 8.0引入了用于入口准入控制的新队列。 等待从网络进入数据库的操作会进入入口队列。 默认,队列是不受限制的,这意味着MongoDB允许所有操作通过此阶段执行,而无需任何排队。 将队列最大值设置为特定值可让您在当前操作数量达到指定限制时在此阶段对操作进行排队。

从MongoDB 8.0 开始,您可以对集合取消分片,并在分片集群上的分片之间移动未分片分片的。

从 MongoDB 8.0 开始,可以使用 moveCollection 命令将未分片集合移到不同的分片中。

有关详细信息,请参阅可移动集合。 要开始使用,请参阅移动集合。

从 MongoDB 8.0 开始,movePrimary 不会将具有变更流的集合作废。将集合移到新的分片之后,变更流可以继续从集合中读取事件。

有关详细信息,请参阅移动具有变更流的集合

从MongoDB 8.0开始,您可以使用unshardCollection命令或sh.unshardCollection()方法对现有分分片的集合取消分片。 此操作将集合中的所有文档移动到指定的分分片或分片量最少的分片上。

有关详细信息,请参阅未分片集合。 要开始使用,请参阅对集合取消分片。

从MongoDB 8.0开始,您可以配置配置服务器来存储除通常的分分片集群元数据数据之外的应用程序数据。 同时提供配置服务器和分片服务器功能的mongod节点称为配置分片。 作为不带分分片服务器功能的独立运行--configsvr运行的mongod节点称为专用配置服务器。

要将专用配置服务器配置为作为配置分片运行,请运行transitionFromDedicatedConfigServer命令。

要将配置分片配置为作为专用配置服务器分片,请运行transitionToDedicatedConfigServer命令。

有关详细信息,请参阅配置分片。要开始使用,请参阅使用配置分片启动分片集群。要将副本集转换为具有配置分片片的分片分片集群,请参阅使用嵌入式配置服务器将副本集转换为分片集群。

从MongoDB 8.0开始, serverStatus在其输出中包含以下新的shardingStatistics字段:

MongoDB 7.1包含以下针对数据数据块迁移的新分片统计信息:

从 MongoDB 7.2 开始,当您使用哈希分片键对collection进行分片时,该操作默认为每个分片创建一个数据块。Previously, the operation created two chunks by default.

从MongoDB 8.0开始,您可以使用directShardOperations角色执行需要直接对分片执行命令的分片操作。

警告

使用directShardOperations角色运行命令可能会导致集群停止正常工作,并可能导致数据损坏。 仅将directShardOperations角色用于维护目的或在MongoDB支持的指导下使用。 执行完维护操作后,请停止使用directShardOperations角色。

从MongoDB7.1 开始,当客户端的mongos getMore 请求设置 exhaustAllowed 标志时, 支持耗尽游标。当客户端收到数据库服务器针对单个请求的多个回复时,这可以提高分分片的集群上的查询性能。

从MongoDB 7.1开始, mongos接受来自 [ 0 , 65535 ] 的--port值。 有关更多信息,请参阅--port

从 MongoDB 7.1开始, findAndModifydeleteOne()可以使用部分分片键来查询分片集合。

MongoDB 7.2 在reshard collection操作中引入了显着的性能改进,从而大幅减少了操作的运行时间。

此外,如果您的应用程序和集群满足必要的要求限制,则可以使用reshardCollection命令对同一键上的collection重新分片,从而重新分发您的collection,这比备用范围迁移过程要快得多。

命令中添加了以下选项:

字段
说明
forceRedistribution
启用同键重新分片。

有关示例,请参阅将数据重新分发到新分片。

从 MongoDB 7.1开始, fsyncfsyncUnlock命令可以对分片集群执行 fsync 操作。

当在mongos上运行且lock字段设立为true时, fsync命令会将写入操作从存储层刷新到磁盘并锁定每个分分片,从而阻止其他写入操作。 然后可以使用fsyncUnlock命令解锁集群。

此功能支持使用mongodump进行分分片的集群的自我管理备份。

从MongoDB 7.1开始,在分分片的集合上使用updateOne()upsert: true时,您不需要过滤中包含完整的分分片键。

从 MongoDB 8.0 开始,可以在事务内使用 $lookup 阶段,并以分片集合为目标。

从MongoDB 8.0开始,当大多数副本集成员已写入更改的oplog条目时,使用"majority"写关注(write concern)的写入操作会返回确认。 这提高了"majority"写入的性能。 在以前的版本中,这些操作将等待,并在大多数副本集成员应用更改后返回确认。

如果您的应用程序在收到来自{ w: "majority" }写入操作的确认后立即从从从节点(secondary node from replica set)读取(没有因果一致的会话),则查询返回的结果可能不包括写入更改。

从 MongoDB 8.0 开始,使用 replSetGetStatus 命令时可以使用以下指标:

从MongoDB 8.0开始,从节点并行为每个批处理写入和应用oplog条目。 写入器线程从主节点 (primary node in the replica set)节点读取新条目并将其写入本地oplog。 应用程序线程将这些更改异步应用到本地数据库。 此更改增加了从节点的复制吞吐量。

这为metrics.repl.buffer引入了一项破坏性变更 (breaking change),因为它现在提供了两个缓冲区(而不是一个)的指标。

MongoDB 8.0弃用了以下服务器状态指标:

MongoDB 8.0添加了以下服务器状态指标:

从 MongoDB 8.0 开始,MongoDB 使用升级版 TCMalloc,此版本使用每 CPU 缓存而不是每线程缓存,以减少内存碎片,并使数据库对高压工作负载更有弹性。

新的 TCMalloc 版本直接影响之前针对透明大页面的生产建议。 要学习;了解更多信息,请参阅针对自托管部署的 TCMalloc 性能优化。

从MongoDB 8.0开始,以下新的serverStatus指标报告有关tcmalloc使用情况的信息:

从 MongoDB 8.0 开始,Bulk.insert() 和数据提取工作负载可能表现得更好。不过,在运行这些工作负载之后立即关闭 MongoDB 可能需要更长的时间,因为在将额外的数据刷新到磁盘上。

从 MongoDB 8.0 开始,除了常用分片集群元数据以外,还可以配置一个配置服务器,以存储应用程序数据。此配置服务器被称为配置分片。有关详细信息,请参阅配置分片

从 MongoDB 7.3开始, compact命令包含一个新的freeSpaceTargetMB选项,用于指定可恢复的最小存储空间量(以兆字节为单位)才能继续压缩。

从 MongoDB 8.0 开始,可以使用新的 autoCompact 命令执行后台压缩。如果启用,服务器会尝试将每个集合和索引内的可用空间保持在指定的 freeSpaceTargetMB 值以下。

如果启用,compact 命令将返回压缩可以从目标集合中回收的空间大小(以字节为单位)的估计值。如果在 dryRun 设置为 true 的情况下运行 compact,MongoDB 只返回估计值,而不执行任何类型的压缩。

从MongoDB 7.1开始,当您运行针对同一数据库中不同集合的多个DDL 操作时, MongoDB会并发运行这些操作。

此更改向serverStatus locks字段和currentOp.locks输出添加了两种新类型:

  • DDLDatabase

  • DDLCollection

从 MongoDB 7.2 开始,尝试在mongos部署上使用不存在的数据库的聚合管道查询会返回验证错误。

在以前的版本中,这些聚合查询返回空游标。

在 MongoDB 8.0 中,如果在集群执行 DDL 操作(修改集合的操作,例如 reshardCollection)时添加或删除分片,将只在完成并发 DDL 操作之后执行任何添加或删除分片的操作。

从 MongoDB 7.1开始,当管道超过管道阶段限制时,聚合命令将引发错误。 有关更多详细信息,请参阅阶段数限制。

从 MongoDB 7.2 开始,您可以为$getField操作符的field输入指定解析为字符串的任何有效表达式。 在早期版本中, field仅接受字符串常量。

从 MongoDB 7.1 开始,索引构建得到了改进,报告速度更快,韧性更强。您还可以使用新的indexBuildMinAvailableDiskSpaceMB参数设置索引构建所需的最小可用磁盘空间,如果磁盘空间太低,该参数会停止索引构建。

添加了以下新的索引构建指标:

有关完整详细信息,请参阅索引构建。

MongoDB 7.1添加了auditConfig集群参数,其中包含有关来自mongodmongos服务器实例的Atlas 审核配置的信息。

从 MongoDB 8.0 开始,可以使用 defaultMaxTimeMS 集群参数为要完成的个别读取操作指定默认时间限制。

MongoDB 7.1添加了indexBuildMinAvailableDiskSpaceMB参数,该参数允许您设立索引构建所需的最小可用磁盘空间。

从 MongoDB 8.0 开始,默认启用了 tcmallocEnableBackgroundThread。这样将使 MongoDB 定期将内存重新释放给操作系统。

从 MongoDB 8.0 开始,可以使用新的 bulkWrite 命令在一个请求中对多个集合执行很多插入、更新和删除操作。现有的 db.collection.bulkWrite() 方法只允许在一个请求中修改一个集合。

MongoDB 8.0 引入了一个新的查询结构。预先存在的查询结构已重命名为计划缓存查询结构

从 MongoDB 8.0 开始,可以为新的查询结构添加查询设置。在查询规划期间,查询优化器使用查询设置作为附加输入,这样会影响为运行具有匹配的查询结构的查询而选择的计划。

索引过滤器相比,查询设置具有经过改进的功能。从 MongoDB 8.0 开始,还弃用了索引过滤器,因此应避免使用它们。

从MongoDB 8.0开始, queryShapeHash包含在以下输出中:

从 MongoDB 8.0 开始,预先存在的 queryHash 字段被重命名为 planCacheShapeHash。如果正在使用早期版本的 MongoDB,您将看到 queryHash 而不是 planCacheShapeHash

从 MongoDB 8.0 开始,getParameter 命令接受 setAt 字段。可以使用此字段过滤 allParameters: true 返回文档,以便只显示可以在启动运行时设置的那些参数。

从 MongoDB 8.0 开始,可以在固定大小集合上使用读关注 "snapshot"

从MongoDB 7.1开始, serverStatus命令输出包括以下新指标:

从MongoDB 7.2开始, serverStatus命令输出包括以下新指标:

从MongoDB 7.3开始, serverStatus命令输出包括以下新指标:

从MongoDB 8.0开始, serverStatus命令输出包括以下新指标:

从 MongoDB 8.0 开始,updateOne() 方法支持 sort 选项。此选项将控制 MongoDB 在选择文档以接收更新之前如何对文档进行排序。

以前的版本使用 findAndModify()findOneAndUpdate() 方法,按照用户指定的排序顺序更新第一个文档。对可重试写入的支持要求这些方法将整个文档复制到每个节点的特殊侧方集合中,这是一个比具有新的 sort 选项的 updateOne() 方法更昂贵的操作。

从MongoDB 7.1开始, distinct命令中提供hint字段,允许您指定查询的索引。

从 MongoDB7.1 开始,您可以在固定大小 集合 上创建 TTL 索引

从版本 8.0 开始,MongoDB 可以使用块处理来执行某些时间序列查询。这一性能改进利用数据“块”而不是单个值来处理查询。当使用时间序列集合时,块处理可提高查询执行速度和吞吐量。

要查看时间序列查询是否使用块处理,请检查解释计划输出中的 explain.queryPlanner.winningPlan.slotBasedPlan.stages 字段。

要了解更多信息,请参阅块处理

从 MongoDB 8.0 开始,有限的一组查询(包括 _id 等值匹配)会跳过常规查询规划和执行。这些查询使用一项经过优化的索引扫描计划,该计划由以下计划阶段之一组成:

  • EXPRESS_CLUSTERED_IXSCAN

  • EXPRESS_DELETE

  • EXPRESS_IXSCAN

  • EXPRESS_UPDATE

有关查询计划的更多信息,请参阅解释结果

从 MongoDB 8.0 开始,被拒绝的查询计划只包含查询的 find 部分。在以前的版本中,被拒绝的计划可以包含聚合阶段,例如 $group。查询规划器不使用这些聚合阶段来选择获胜计划,因此 rejectedPlans 字段只包含查询中用于选择获胜计划的部分。

这一更改还确保被拒绝的计划的 executionStats 不为零。因此,您现在可以查看统计信息,例如被拒绝的计划检查了多少个文档或密钥。

有关被拒绝的查询计划的更多信息,请参阅 explain.queryPlanner.rejectedPlans

从 MongoDB 8.0 开始,多文档事务的插入操作不再生成单独的 oplog 条目。相反,系统会将多文档插入操作作为单个条目进行批处理。每个文档的变更流 insert 事件具有相同的 clusterTime

这一更改提高了多文档插入操作的性能,并消除了多次 oplog 写入操作可能产生的复制延迟。

从 MongoDB 8.0 开始,当定义了多个身份提供程序 (IDP) 时,只要 audience 值对于每个发布者都是唯一的,oidcIdentityProviders 参数就会接受重复的 issuer 值。在版本 7.3 和 7.0 中,也可以使用此功能。

从MongoDB 8.0开始,对$lookup$unionWith内部子管道中的命名空间进行验证,以确保正确使用fromcoll字段。

有关详细信息,请参阅$lookup 子管道$unionWith 子管道。

explain()方法现在会返回有关查询规划器优化时间的信息。queryPlanner.optimizationTimeMillis状态显示查询规划器在优化上花费的时间(以毫秒为单位)。

本部分介绍MongoDB 8.0中的已知问题及其解决状态。

版本中
问题
状态
8.0.0
SERVER-94741 :当包含顶级$or $and子句(包括隐式$and 子句)的 查询可以使用多个索引时,该查询可能会使用效率较低的索引,因为在新的MongoDB8 0中查询规划的“索引修剪”阶段。 。
未解决。 计划在8.0.1 中通过禁用 SERVER-94738 中的索引修剪功能来缓解。
8.0.0

SERVER-95244 :当满足以下所有条件时,单分片分片的上的更新或插入操作可能会更频繁地失败:

  • 该操作直接向分分片,而不是向mongos发出。

  • 更新或更新或插入(upsert)操作完全是插入。

  • 命名空间未接收来自mongos路由器的操作。

  • 该命名空间未接收任何其他操作。

过渡到分分片集群的推荐进程需要移动客户端以连接到mongos路由器。 向mongos路由器发出的写入不受影响。

此问题计划在8.0.1中修复。

重要

特征兼容性版本

要从 7.0 部署升级到 MongoDB 8.0,7.0 部署必须将 featureCompatibilityVersion 设置为 7.0。要检查版本:

db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )

要升级到 MongoDB 8.0,请参阅特定于您的 MongoDB 部署的升级说明:

如您在升级到 8.0 版本的过程中需要指导,MongoDB 的专业服务将提供主要版本的升级支持,帮助确保您的 MongoDB 应用程序能够顺利过渡,不会中断。要了解更多信息,请参阅 MongoDB 咨询服务

要下载 MongoDB 8.0,请访问 MongoDB 下载中心

后退

版本说明