Docs 菜单
Docs 主页
/
MongoDB Manual
/

MongoDB 4.4 发布说明

在此页面上

  • 补丁版本
  • 全时诊断数据捕获要求
  • 聚合(Aggregation)
  • 副本集
  • 分片集群
  • 投射
  • 事务
  • 排序
  • 安全改进
  • 结构化日志
  • 平台支持
  • Mongo Shell
  • 工具
  • 驱动程序
  • 索引
  • 已删除的命令
  • 网络
  • 总体改进
  • 影响兼容性的变更
  • 升级程序
  • 降级考虑因素
  • 立即下载
  • 已知问题
  • 报告问题

警告

过去的版本限制

以下关键公告会影响某些先前的 MongoDB 版本。如果您的部署依赖于受关键公告影响的功能,请升级到最新的可用补丁版本。

问题
受影响的版本
WT-7426
4.4.5
4.4.8
4.4.2 - 4.4.8
4.4.0 - 4.4.18 (ARM64 或 POWER 系统架构)
4.4.8 - 4.4.21 (Ops Manager 或 Cloud Manager 集群上的增量备份)
4.4.7

重要

修复 MongoDB Server 可能允许成功的不可信连接的问题

由于 CVE- 2024 - 1351 ,在 MongoDB 4中。 4之前的4 。 4 。 29 ,在某些 --tlsCAFileCAFile配置下,MongoDB Server 可能会跳过对等证书验证,从而导致不可信连接成功。

这可能会有效降低 TLS 提供的安全保证,并打开由于证书验证失败而应关闭的连接。此问题会影响以下 MongoDB Server 版本:

  • 7.0.0 - 7.0.5

  • 6.0.0 - 6.0.13

  • 5.0.0 - 5.0.24

  • 4.4.0 - 4.4.28

CVSS 分数:8.8

CWE:CWE-295:证书验证不正确

修复的问题:

修复的问题:

修复的问题:

修复的问题:

修复的问题:

修复的问题:

修复的问题:

修复的问题:

修复的问题:

修复的问题:

修复的问题:

修复的问题:

修复的问题:

修复的问题:

修复的问题:

修复的问题:

修复的问题:

修复的问题:

修复的问题:

修复的问题:

修复的问题:

修复的问题:

修复的问题:

修复的问题:

从版本 4.4 开始,如果 mongodmongos 中的全时诊断数据捕获 (FTDC) 线程失败,则会终止发起进程。为避免最常见的故障,请确认运行 mongod/mongos 的用户拥有在 storage.dbPath 中(对于 mongod)或平行于 systemLog.path 的位置(对于 mongos)创建 FTDC diagnostic.data 目录的权限。

MongoDB 4.4 添加了$unionWith 聚合阶段,能够将来自多个集合的管道结果组合成一个结果集。

有关详细信息,请参阅$unionWith

从版本 4.4 开始,MongoDB 提供以下这些新操作符,允许用户定义自定义聚合表达式:

通过添加这些新操作符,您可以使用聚合来写入自定义 JavaScript 表达式,而不必依赖 mapReduce$where

注意

即使在版本 4.4 之前,各种 map-reduce 表达式也可以使用其他聚合管道阶段(如$group$merge 等)进行重写,无需自定义函数。

有关更多信息,请参阅 Map-Reduce 到聚合管道

Operator
说明
返回用户定义的累加器操作符的结果。
返回给定字符串或二进制数据值内容的大小(以字节为单位)。
以字节为单位返回给定文档(即 bsontype Object) 的大小(当编码为 BSON 时)。
定义自定义聚合表达式。

如果指定表达式解析为 integerdecimaldoublelong,则返回布尔值 true

如果表达式解析为任何其他 BSON 类型null 或缺失字段,则会返回布尔值 false

替换给定输入中匹配字符串的第一个实例。
替换给定输入中匹配字符串的所有实例。

从 MongoDB 4.4 开始:

  • $out 可以输出到其他数据库中的集合。在早期版本中,$out 只能输出到运行聚合的同一个数据库中的集合。

  • 只有当集群中的所有节点都将 featureCompatibilityVersion 设置为 4.4 或更高版本且读取偏好允许从节点读取时, $out才能在副本集从节点上运行。查看驱动程序文档,了解驱动程序何时添加了支持。

从 MongoDB 4.4 (4.2.4 亦可)开始:$indexStats 会在其输出中包含以下字段:

字段
说明
分片名称(如果适用)。
索引规范文档
一个布尔标志,指示当前是否正在生成索引。

从 MongoDB 4.4 开始:

  • $merge 可以输出到其他数据库中的集合。在早期版本中,$merge 只能输出到运行聚合的同一数据库中的集合。

  • 只有当集群中的所有节点都将 featureCompatibilityVersion 设置为 4.4 或更高版本且读取偏好允许从节点读取时, $merge才能在副本集从节点上运行。查看驱动程序文档,了解驱动程序何时添加了支持。

$merge 可以输出到正在聚合的同一集合。此外,也可输出到管道其他阶段所出现的集合,例如 $lookup

警告

$merge 输出到正在聚合的同一个集合时,文档可能会多次更新,或是此操作可能会导致无限循环。当 $merge 执行的更新改变磁盘上所存储文档的物理位置时,便会出现此行为。当某一文档的物理位置发生变化时,$merge 可能会将其视为全新文档,从而执行更多更新。有关此行为的更多信息,请参阅万圣节问题

从版本 4.4 开始,

从 MongoDB 4.4 开始,$collStats 接受 queryExecStats 字段作为参数文档。提供此字段会在输出中返回以下字段:

collectionScans字段包含一个包含以下字段的嵌入式文档:

字段名称
说明
total
一个 64 位整数,表示执行collection扫描的查询总数。总数包括使用和未使用可追加游标的查询。
nonTailable
一个 64 位整数,给出执行未使用可追加游标的集合扫描的查询数量。

从 MongoDB 4.4 开始,当您在 executionStatsallPlansExecution 模式中运行 db.collection.explain().aggregate() 方法时,在解释输出中列出的每个管道阶段均包含 nReturnedexecutionTimeMillisEstimate

从 MongoDB 4.4 开始,如果被暂时(即临时)网络错误、集合删除或集合重命名中断,从节点执行初始同步以尝试恢复同步进程。同步源还必须运行 MongoDB 4.4 以支持可恢复初始同步。如果同步源运行 MongoDB 4.2 或更早版本,从节点就像遇到非暂时性网络错误一样必须重启初始同步进程。

默认情况下,从节点会尝试在 24 小时内恢复初始同步。MongoDB 4.4 增加了 initialSyncTransientErrorRetryPeriodSeconds 服务器参数,用于控制从节点尝试恢复初始同步的时间长度。如果从节点无法在配置的时间段内成功恢复初始同步进程,则会从副本集中选择一个新的健康源,然后从头开始重新启动初始同步进程。

在 MongoDB 4.4 之前,如果从节点在进程中遇到错误,它将重新启动整个初始同步。

从 MongoDB 4.4 开始,来自源的同步会向其同步从节点发送连续的 oplog 条目流。

在比 MongoDB 4.4 更早的版本中,从节点通过向其同步源发出请求并等待响应来获取批量 oplog 条目。这需要对每批 oplog 条目进行一次网络往返。MongoDB 4.4 添加了 oplogFetcherUsesExhaust 启动参数,用于禁用流复制和使用较早的复制行为。

有关详细信息,请参阅流复制

从 Mongo 4.4 开始,集合的回滚目录以集合的 UUID 命名,而不是以集合命名空间命名;例如

<dbpath>/rollback/20f74796-d5ea-42f5-8c95-f79b39bad190/removed.2020-02-19T04-57-11.0.bson

有关详细信息,请参阅回滚数据

您可以指定保留 oplog 条目的最小小时数,在此期间, mongod 在以下两个条件都满足时才会删除 oplog 条目:

  • oplog 已达到最大配置大小

  • oplog 条目早于根据主机系统时钟配置的小时数。

默认情况下,MongoDB 不设置最小 oplog 保留期,并自动从最旧的条目开始截断 oplog,以维持配置的 oplog 最大大小。

要在启动 mongod 时配置 oplog 最短保留期,请执行以下任一操作:

要在正在运行的 mongod 上配置最短 oplog 保留期,请使用 replSetResizeOplog。在 mongod 运行时设置最短 oplog 保留期会覆盖启动时设置的任何值。您必须更新相应配置文件设置或命令行选项的值,才能在服务器重启后继续保持这些更改。

重要

oplog 的大小可以不受限制地增长,以便在配置的小时数内保留 oplog 条目。由于写入量高且保留期长,这可能会导致系统磁盘空间减少或耗尽。

提示

另请参阅:

从 MongoDB 4.4 开始,副本集从节点上的慢 oplog 应用程序日志会受到 slowOpSampleRate 的影响。在以前的版本中,无论采样率如何,MongoDB 都会记录所有慢 oplog 条目。

slowOpSampleRate 指定应分析或记录的慢速操作的比例。

注意

需要 featureCompatibilityVersion 4.4+

副本集或分片集群中的每个 mongod 必须featureCompatibilityVersion 设置为至少 4.4,才能跨副本集节点同时启动索引构建。

索引构建在副本集或分片集群上,并在所有数据承载副本集成员上同时构建。对于分片集群,索引构建仅会在包含当前被索引集合的数据的分片上进行。主节点需要最少数量的数据承载 voting 节点(即提交法定节点数),包括其自身,这些节点必须在将索引标记为可供使用之前完成构建。

默认情况下,索引构建使用所有数据承载投票节点的提交法定人数。为了使用非默认提交法定人数启动索引构建,MongoDB 4.4 会将 commitQuorum 参数添加到 createIndexes 或其 shell 助手 db.collection.createIndex()db.collection.createIndexes()

为了修改正在进行的索引构建所需的 quorum,MongoDB 4.4 引入了新的 setIndexCommitQuorum 命令。

有关详细信息,请参阅复制环境中的索引构建

从 MongoDB 4.4 开始,replSetReconfig 命令会等待大多数投票节点安装副本配置后才返回成功。投票节点是 members[n].votes1任何副本节点,包括仲裁节点。首先,该操作会等到当前配置提交后才在主节点上安装 配置。然后,该操作会等待大多数投票节点安装配置后再成功返回。有关详细信息,请参阅重新配置等待直到大多数节点安装副本配置

replSetReconfig 会无限期地等待多数投票节点默认安装配置。MongoDB 4.4 还为 replSetReconfig 添加了可选的 maxTimeMS 参数,用于指定等待操作成功返回的最长时间。

从 MongoDB 4.4 开始,replSetReconfig 命令允许一次添加或删除不超过 1voting 节点。要添加或删除多个投票节点,请发出一系列 replSetReconfigrs.reconfig() 操作,每次添加或删除一个节点。要了解更多信息,请参阅重新配置一次最多可以添加或删除一个投票节点

replSetGetConfig 命令在主节点上运行时可以指定新选项 commentStatus: true。使用该选项运行时,该命令在输出中会包含 commitmentStatus 字段。此输出字段将指示副本集之前的重新配置是否已提交,以便副本集准备好再次重新配置。有关更多信息,请参阅 replSetGetConfig 命令。

MongoDB 4.4 将 term 字段添加到副本集配置文档中。副本集节点使用 termversion 就“最新”副本配置达成共识。设置 featureCompatibilityVersion (fCV) : "4.4" 隐式执行 replSetReconfigterm 字段添加到配置文档中并阻塞直到新配置传播到多数副本集节点。与之类似,降级至fCV : "4.2"会隐式执行重新配置以删除 term 字段。

从 MongoDB 4.4 开始,您可以使用 initialSyncSourceReadPreference 参数指定首选的初始同步源。您只能在 mongod 启动时使用 setParameter 配置文件设置或 --setParameter 命令行选项设置该参数。

initialSyncSourceReadPreference 支持以下读取偏好模式:

如果副本集已禁用 chaining,则默认 initialSyncSourceReadPreference 读取偏好模式为 primary

无法为 initialSyncSourceReadPreference 指定标签集或 maxStalenessSeconds

提示

另请参阅:

从版本 4.4 开始,MongoDB 使用最近访问的数据提供镜像读,以预热可选举从节点的缓存。通过镜像读,主节点可以镜像其接收的一部分操作,并将其发送到可选举从节点的子集。预热从节点的缓存有助于在选举后更快地恢复性能。

注意

主节点对客户端的响应不受镜像读取的影响。镜像读是主节点的“即发即弃”操作;即主节点不等待镜像读的响应。

MongoDB 4.4 添加以下镜像读取参数。您可以在启动时使用 setParameter 配置文件设置或 --setParameter 命令行选项来设置参数,也可以在运行时使用 setParameter 命令来设置参数:

参数
说明

为镜像读指定 samplingRatemaxTimeMS 设置。

{ samplingRate: <float>, maxTimeMS: <int> }

设为 0samplingRate 会关闭镜像读。

如果在操作中指定包含字段,命令 serverStatus 及其相应的 mongo shell 方法 db.serverStatus() 将返回mirroredReads

db.runCommand( { serverStatus: 1, mirroredReads: 1 } )

或是

db.serverStatus( { mirroredReads: 1 } )

从 4.4 开始,MongoDB 提供 refineCollectionShardKey 命令。使用新命令,您可以通过向现有键添加一个或多个后缀字段来优化集合的分片键。优化集合的分片键可以实现更细粒度的数据分布,并可解决现有键由于关联基数不足而导致巨型(即可不可分割)数据块的问题。

例如,您可能有一个现有的 orders 集合,其分片键为 { customer_id: 1 }。您可以通过向分片键添加后缀 order_id 字段来更改分片键,以便 { customer_id: 1, order_id: 1 } 成为新的分片键,从而允许按 customer_id 字段和 order_id 字段来分发数据。

要使用 refineCollectionShardKey 命令,分片集群的特征兼容性版本(fcv)必须为 4.4。有关更多信息,请参阅 refineCollectionShardKey 命令。

注意

优化分片键后,可能并非集合中的所有文档都具有后缀字段。要填充缺失的分片键字段,请参阅缺失的分片键字段

在细化分片键之前,请确保集合中的所有或大多数文档都具有后缀字段(如果可能),以避免后期再填充字段。

在早期版本中,一旦选定分片键,就无法修改该分片键。

重要

缺少分片键

由于具有使用后缀来优化分片键的能力,因此集合中并非所有文档都具有后缀字段。从版本 4.4 开始,分片集合中的文档可能会缺失分片键字段。在早期版本中,分片集合的每个文档中都必须存在分片键字段。有关详细信息,请参阅缺少分片键字段。

为尽量减少延迟,mongos 实例默认可以使用对冲读。通过对冲读,mongos 实例可以将读取操作路由到每个查询分片的多个成员,并从每个分片的第一个响应者返回结果。默认情况下,mongos 实例支持使用对冲读。要关闭 mongos 实例对对冲读的支持,请设置 mongosreadHedgingMode 参数。

作为读取偏好的一部分,为每个操作都指定了对冲读。非primary读取偏好支持对冲读。读取偏好nearest默认指定对冲读。

有关更多信息,请参阅:

参数
说明
启用或禁用 mongos 实例对对冲读的支持。
指定为对冲读取操作发送的额外读取的最大时间限制(以毫秒为单位)。

为了为读取偏好指定对冲读,MongoDB 4.4 引入了对冲读选项。如要使用 MongoDB 驱动程序进行设置,请参阅驱动程序读取偏好 API 文档。

以下 mongo shell 方法可以接受对冲选项,以针对指定的读取偏好启用对冲读:

命令 serverStatus 及其对应的 mongo Shell 方法 db.serverStatus() 返回 hedgingMetrics

MongoDB 4.4 提供了命令 balancerCollectionStatusmongo Shell 助手方法 sh.balancerCollectionStatus(),用于返回分片集合的数据块在命令运行时是平衡(即不需要移动)还是需要移动的信息。使用该命令,用户可以验证初始数据块创建和迁移是否已完成。

从 MongoDB 4.4 开始,mongos 添加了以下新的默认初创企业行为:

  • mongos 启动时预加载分片集群的路由表,而不是为第一个传入客户端连接按需预加载。

  • mongos 在启动时预热其到分片主机的连接池,而不是按需传入客户端连接进行预热。

此行为使得在启动或重新启动 mongos 实例后能够更快地为初始客户端连接提供服务。具体来说,这允许使用多个 mongos 实例的站点根据需要重新启动它们,或添加新的实例,而无需等待连接建立对这些实例的初始客户端请求。

默认情况下,路由表预加载和连接池预热都处于启用状态。

MongoDB 4.4 添加了以下参数来控制此行为:

执行 movePrimarydropDatabase 命令后,不需要再运行 flushRouterConfig。现在,这两个命令会在运行时根据需要自动刷新分片集群的路由表。在 flushRouterConfig 注意事项中所述的情况下,仍建议手动发出 flushRouterConfig 命令。

从 MongoDB 4.4开始,您可以使用具有单个哈希字段的复合分片键对集合进行分片。在版本 4.4 之前,MongoDB 不支持带有哈希字段的复合分片键。

复合哈希分片支持区域分片等功能,其中前缀(即 first)非哈希字段支持区域范围,而哈希字段支持更均匀的分片数据分布。例如,以下操作根据支持区域分片的组合哈希分片键对集合进行分片:

sh.shardCollection(
"examples.compoundHashedCollection",
{ "fieldA" : 1, "fieldB" : 1, "fieldC" : "hashed" }
)

复合哈希分片还支持带有哈希前缀的哈希分片键,以解析与单调递增字段相关的数据分布问题。例如,以下操作会在组合哈希分片键上分片一个集合,其中哈希字段是分片键前缀:

sh.shardCollection(
"examples.compoundHashedCollection",
{ "_id" : "hashed", "fieldA" : 1}
)

提示

另请参阅:

从 MongoDB 4.4 开始,以下变更将改进故障转移过程中的迁移和孤立文档清理的弹性:

  • 数据块迁移后等待清理的数据块范围现在会持久保留在config.rangeDeletions集合中,并在整个分片中复制。如果发生故障转移,分片的新主节点将读取config.rangeDeletions集合中的文档并继续删除相应的范围。描述等待清理的范围的文档在该范围被删除后将从config.rangeDeletions集合中删除。

  • cleanupOrphaned 命令不再从分片中删除孤立文档。相反,cleanupOrphaned 会等待计划从分片中删除的孤立文档被删除。

将分片主节点上的 disableResumableRangeDeleter 参数设置为 true,以暂停分片上的范围删除。

从 MongoDB 4.4 开始,配置服务器主节点默认检查分片集合的分片之间是否存在索引不一致问题。在配置服务器主节点上运行时,命令 serverStatus 返回字段 shardedIndexConsistency 以报告索引不一致的情况。

为了配置索引一致性检查,MongoDB 提供了以下参数:

参数
说明
启用或禁用索引一致性检查。
配置服务器的主节点检查分片集合索引一致性的频率。

从 MongoDB 4.4 开始,您可以同时进行多个 removeShard 操作。

在早期版本中,如果正在执行另一个 removeShard 操作,removeShard 会返回错误信息。

从版本 4.4 开始,MongoDB 取消了对分片键大小的 512 字节限制。对于 MongoDB 4.2 及更早版本,分片键不能超过 512 字节。

从 4.4 开始,如果 find 或后续 getMore 命令由于所查询的分片不可用而返回部分结果,输出中会包含一个布尔标志 partialResultsReturned

对于太大而无法迁移的数据块,从 MongoDB 4.4 开始:

  • 新的负载均衡器设置 attemptToBalanceJumboChunks 允许负载均衡器迁移太大而无法移动的数据块,只要这些数据块未标记为 jumbo。有关详情,请参阅超出大小限制的负载均衡范围

  • moveChunk 命令可以指定一个新选项 forceJumbo,以便迁移过大而无法移动的数据块。这些数据块可能会也可能不会标记为 jumbo。

从 4.4 开始,如果存在过时的数据块,则仅当路由器访问以前具有或当前具有该数据块的分片时才会刷新目录缓存。

在 MongoDB 4.4 之前,任何过时的数据段都会导致集合的整个数据段分布被标记为过时,并强制所有联系分片的路由器刷新其分片目录缓存。 MongoDB 4.4 添加了enableFinerGrainedCatalogCacheRefresh启动参数,用于仅对目标分片禁用目录缓存刷新并使用较早的目录缓存刷新行为。 enableFinerGrainedCatalogCacheRefresh参数默认为true

从版本 4.4(和 4.2.7)开始,MongoDB 会自动将 system.sessions 集合分割为至少 1024 个数据块,并将这些数据块均匀地分布在集群中的分片中。

从 MongoDB 4.4 开始,作为使find()findAndModify()投影与聚合的$project阶段保持一致的一部分,

  • find()findAndModify() 投影可以接受聚合表达式和聚合语法,包括使用字面量和聚合变量。使用聚合表达式和语法,您可以投影新字段或使用新值投影现有字段。

  • find()findAndModify() 投影可以使用嵌套形式指定嵌入字段,例如 { field: { nestedfield: 1 } } 以及点表示法。在早期版本中,您只能使用点表示法。

有关更多信息,请参阅:

提示

另请参阅:

从 MongoDB 4.4 开始,$meta 操作符添加了对检索 indexKey 元数据的支持。indexKey 元数据仅用于调试目的,不适用于应用程序逻辑。有关更多信息,请参阅$meta

从版本 4.4 开始,MongoDB 在与 db.collection.find() 一起使用时会进行以下 { $meta: "textScore" } 更改:

  • 要使用 { $meta: "textScore" },必须在查询谓词中指定 $text 操作符。

    注意

    $text 为自管理(非 Atlas)部署提供文本查询功能。对于 MongoDB Atlas 上托管的数据,MongoDB 提供了改进的全文查询解决方案Atlas Search。

  • 可以根据搜索相关性对结果文档进行排序,即{ $meta: "textScore" },而无需同时对 textScore 投影。

    In earlier versions, to include { $meta: "textScore" } expression in the sort(), you must also include the same expression in the projection.

  • 如果在投影和排序中都包含 { $meta: "textScore" } 表达式,即 db.collection.find(<$text search>, <projection>).sort(<sort>),则投影和排序文档可以为该表达式使用不同的字段名称。

    In previous versions of MongoDB, if you include the { $meta: "textScore" } in both the projection and sort, you must specify the same field name in both places.

有关详细信息,请参阅文本分数元数据$meta: "textScore" 。有关"textScore"投影和排序的示例,请参阅相关性分数示例。

请参阅:文本元数据 { $meta: "textScore" } 查询要求

从含特征兼容性版本 (fcv) "4.4" 的 MongoDB 4.4 开始,除非事务是跨分片写事务,否则可以在多文档事务中创建集合和索引。

在事务中创建集合时:

在事务中创建索引时:

  • 您可以在不存在的集合上创建索引。集合作为操作的一部分创建。

  • 您可以在先前同一事务中创建的新空集合上创建索引。

  • 如果针对系统集合执行 db.collection.createIndex() 方法,则该方法将失败。

有关更多详细信息,请参阅在事务中创建集合和索引

MongoDB 4.4 添加了一个新参数 shouldMultiDocTxnCreateCollectionAndIndexes,它可以启用(默认)或禁用事务内部的集合和索引创建。为分片集群设置参数时,在所有分片上设置该参数。

要在事务内显式创建集合或索引,事务读关注级别必须为 "local"。显式创建通过以下方式实现:

提示

另请参阅:

从 MongoDB 4.4 开始,sort() 方法现在使用与 $sort 聚合阶段相同的排序算法。进行此更改后,对包含重复值的字段执行 sort() 操作的查询很可能会导致这些值的排序顺序不一致。

在对重复值使用 sort() 时,为保证排序的一致性,请在排序中加入一个只包含唯一值的附加字段。

通过在排序中添加 _id 字段可以轻松完成此操作。

有关更多信息,请参阅排序一致性

MongoDB Enterprise 4.4 提供了一种新的 mongokerberos 工具,用于验证平台的 Kerberos 配置是否可用于 MongoDB,以及测试通过 Kerberos 进行的端到端客户端身份验证。运行时, mongokerberos 将返回一份报告,指出遇到的任何问题,并提供解决这些问题的潜在建议。mongokerberos 仅在 MongoDB Enterprise 中可用。

从版本 4.4 开始,MongoDB 默认启用 OCSP(在线证书状态协议)来检查证书是否撤销。使用 OCSP 后,无需定期下载 Certificate Revocation List (CRL) 并使用已更新的 CRL 重新启动 mongod/mongos

在版本 4.0 和 4.2 中,只能通过在 Windows 或 macOS 上使用 system certificate store 来使用 OCSP。

提示

另请参阅:

作为 OSCP 支持的一部分,MongoDB 4.4 在 Linux 上支持以下功能:

  • OCSP 装订。通过 OCSP 装订,mongodmongos 实例可以在 TLS/SSL 握手期间向客户端提供其证书时,将 OCSP 状态响应附加或“装订”到这些证书中。通过将 OCSP 状态响应包含在证书中,OCSP 装订可以让客户端无需发出单独请求来检索所提供证书的 OCSP 状态。

  • OCSP 必备装订扩展 。 OCSP 必须装订是一个可以添加到服务器证书中的扩展,它告诉客户端在 TLS/SSL 握手期间接收证书时需要 OCSP 装订。

MongoDB 4.4 添加了以下 OCSP 参数。您可以使用 setParameter 配置文件设置或 --setParameter 命令行选项在启动时设置这些参数:

参数
说明
启用或禁用 OCSP 支持。
指定在刷新装订的 OCSP 状态响应之前等待的秒数。
指定 mongod / mongos 实例在接收其证书的 OCSP 状态响应时应等待的最大秒数。
指定 mongod / mongos 在客户端证书验证时应等待 OCSP 响应的最大秒数。

从 MongoDB 4.4 开始,如果提供的 x.509 证书在 mongod/mongos 系统时钟的 30 天内过期,则 mongod/mongos 会记录连接上的警告。具体而言,以下与 mongodmongos 的连接可能会触发 x.509 证书过期警告:

警告日志消息类似于以下内容:

<Timestamp> W NETWORK [connection] Peer certificate <Certificate Subject Name> expires...

请考虑主动续订即将到期的客户端 x.509 证书,确保与集群的持续连接。

MongoDB 4.4 添加了用于控制证书到期警告阈值的 tlsX509ExpirationWarningThresholdDays 参数。将参数设置为 0 以禁用警告。有关完整文档,请参阅 tlsX509ExpirationWarningThresholdDays

在 CentOS 8 和 RHEL 8 上,MongoDB 4.4(以及 4.2、4.0 和 3.6)支持 TLS1.3。

如果由于联网或 LDAP 服务器身份验证失败导致无法评估某个用户与标识名 (DN) 的映射,mongod mongosmongoldap 将返回错误信息。

mongodmongosmongoldap 拒绝连接请求,并且不检查其余映射(如果有)。

要指定用户到 DN 映射,请参阅:

从 MongoDB 4.4 开始,mongod / mongos 实例现在以结构化 JSON 格式输出所有日志消息。日志条目以一系列键值对的形式编写,每个键表示日志消息字段类型,例如“严重性”,每个对应的值记录该字段类型的关联日志信息,例如“信息”。

这包括发送到文件syslogstdout(标准输出)日志目标的日志输出,以及 getLog 命令的输出。

以前,日志条目以明文形式输出。

以下 JSON 格式的日志消息表明 mongod 正在侦听并准备连接:

{"t":{"$date":"2020-05-18T20:18:13.533+00:00"},"s":"I", "c":"NETWORK", "id":23015, "ctx":"listener","msg":"Listening on","attr":{"address":"127.0.0.1"}}
{"t":{"$date":"2020-05-18T20:18:13.533+00:00"},"s":"I", "c":"NETWORK", "id":23016, "ctx":"listener","msg":"Waiting for connections","attr":{"port":27001,"ssl":"off"}}

使用键值对进行结构化日志记录,可让自动化工具或日志摄取服务进行高效的日志分析,并使程序化日志解析变得更简单、更强大。

在使用 MongoDB 结构化日志时,第三方 jq 命令行实用程序 非常有用,可以轻松美观地打印日志条目,并提供强大的基于键的匹配和过滤功能。

jq 是一个开源 JSON 解析器,用于 Linux、Windows 和 macOS。

有关结构化日志的更多信息,包括对日志条目组件的详细检查以及命令行解析示例,请参阅日志消息。

从 MongoDB 4.4 开始,ldapQueryPassword setParameter 命令接受字符串或字符串数组。如果设置为数组,则尝试每个密码,直到成功为止。执行 LDAP 帐户密码轮换,MongoDB 无需停机。

MongoDB 4.4 增加了对以下平台的支持:

MongoDB 4.4 删除了对以下平台的支持:

  • Amazon Linux 2013.03

  • s390x 架构上的 RHEL 6 / CentOS 6 / Oracle 6

  • Windows 7 / 服务器 2008 R2

  • Windows 8 / Server 2012

  • Windows 8.1 / 服务器 2012 R2

  • macOS 10.12

如需获取 MongoDB 4.4 支持的平台和架构的完整列表,请参阅平台支持

从 MongoDB4.4 开始,mongo Shell 支持使用 AWS IAM 凭证对已配置为 AWS IAM 身份验证的 MongoDB Atlas 集群进行身份验证。

这种身份验证方式使用新的 MONGODB-AWSauthentication mechanism,需要提供 AWS 访问密钥 ID 和秘密访问密钥,这可以在连接字符串中指定,也可以通过 --username--password 选项在命令行中指定。

此外,如果在使用 AssumeRole 请求,您使用 AWS 会话令牌通过临时凭据进行身份验证,或在使用指定此值的 AWS 资源(如 Lambda)时,您可以在连接字符串中使用 AWS_SESSION_TOKEN authMechanismProperties 值提供该会话令牌,或在命令行中通过 --awsIamSessionToken 选项提供该会话令牌。

或者,如果 AWS 访问密钥 ID、秘密访问密钥或会话令牌是通过各自的 AWS IAM 环境变量在您的平台上定义的,则 mongo shell 将使用这些环境变量值进行身份验证;无需在连接字符串中指定。

有关用法,请参阅连接字符串身份验证选项,以及使用 MONGODB-AWS 连接到 Atlas 集群以获取示例。

从 MongoDB 4.4 开始,以下工具的文档已迁移到 MongoDB 数据库工具项目

MongoDB 数据库工具使用 Apache 许可证(版本 2.0)。有关源代码,请参阅 mongodb/mongo-tools

注意

有关所列工具以前版本的文档,请参阅相应版本的 MongoDB 服务器手册。

指向较旧文档的快速链接:

MongoDB Enterprise 4.4 提供了一种新的 mongokerberos 工具,用于验证平台的 Kerberos 配置是否可用于 MongoDB,以及测试通过 Kerberos 进行的端到端客户端身份验证。运行时, mongokerberos 将返回一份报告,指出遇到的任何问题,并提供解决这些问题的潜在建议。mongokerberos 仅在 MongoDB Enterprise 中可用。

请参阅 mongokerberos 参考页以了解更多信息。

从 MongoDB 4.4 开始,mongoreplay 已从 MongoDB 包中移除。mongoreplay 及其相关文档已迁移至 mongodb-labs github 项目。mongodb-labs 中的项目是实验性的项目,并未得到 MongoDB 的官方支持。

指向较旧文档的快速链接

社区版和企业版的 Windows MSI 安装程序不包含 MongoDB Database Toolsmongoimportmongoexport 等)。如要在 Windows 上下载并安装 MongoDB Database Tools,请参阅安装 MongoDB Database Tools。

如果您使用 MongoDB 4.2 或以前的 MSI 安装程序,要将Database Tools 与 MongoDB Server 一起安装,现在必须单独下载 Database Tools。

MongoDB 4.4 增加了对使用单个哈希字段创建复合索引的支持。MongoDB 4.2 及更早版本仅支持单字段哈希索引。

以下操作会在 country_id 上上创建组合哈希索引:

db.examples.createIndex( { "country" : 1, "_id" : "hashed" } )

复合哈希索引需要将 featureCompatibilityVersion 设置为 4.4

从版本 4.4 开始,MongoDB 添加了对查询规划器隐藏或取消隐藏索引的功能。向查询规划器隐藏的索引不会作为查询计划选择的一部分进行求值。

通过向规划器隐藏索引,用户可以评估在不实际删除索引的情况下删除索引的潜在影响。如有不利影响,您可以取消隐藏该索引,而不必重新创建删除的索引。由于索引在隐藏期间得到完全维护,因此一旦取消隐藏,索引就立即可用。

有关详情,请参阅隐藏索引

为了支持隐藏索引,MongoDB 引入了:

如果为 dropIndexes 指定的索引仍在构建中,dropIndexes 会尝试中止正在进行的构建。中止索引构建与删除构建的索引具有相同的效果。在 MongoDB 4.4之前,如果集合中有任何正在进行的索引构建,dropIndexes 将会返回错误。此行为也适用于 shell 助手 db.collection.dropIndex()db.collection.dropIndexes()

要从一组正在进行的相关构建中删除特定索引,请等待索引构建完成,并将该索引指定为 dropIndexes 或其 shell 助手。

有关更完整的文档,请参阅:

在删除目标集合之前,db.collection.drop() 方法和 drop 命令会中止目标集合上任何正在进行的索引构建。

对于副本集或分片副本集,中止主节点上的索引不会同时中止从节点索引构建。MongoDB 尝试中止主节点上指定索引正在进行的构建。如果成功,则会创建关联的 abort oplog 条目。节点如果有正在进行的构建的副本,则在提交或中止索引构建之前会等待来自主节点的提交或中止 oplog 条目。

对于副本集或分片副本集,中止主节点上的索引不会同时中止从节点索引构建。MongoDB 尝试中止主节点上指定索引正在进行的构建。如果成功,则会创建关联的 abort oplog 条目。节点如果有正在进行的构建的副本,则在提交或中止索引构建之前会等待来自主节点的提交或中止 oplog 条目。

db.dropDatabase() 方法和 dropDatabase 命令将会先中止在目标数据库中的集合上构建的任何正在进行的索引,然后再丢弃数据库。中止索引构建与删除构建的索引具有相同的效果。

提示

另请参阅:

MongoDB 4.4 弃用了 geoHaystack 索引和 geoSearch 命令。请改用带有 $geoNear$geoWithin2d 索引

MongoDB 删除了以下命令和 mongo shell 助手:

已删除的命令
已删除助手
替代方案
cloneCollection
db.cloneCollection()
planCacheListPlans
PlanCache.getPlansByQuery()
planCacheListQueryShapes
PlanCache.listQueryShapes()

从 MongoDB 4.4 开始,mongodmongos 默认支持 TCP 快速打开 (TFO) 连接。TFO 需要客户端和 mongod/mongos 主机支持并启用 TFO:

Windows

以下 Windows 操作系统支持 TFO:

  • Microsoft Windows Server 2016 及更高版本。

  • Microsoft Windows 10 更新 1607 或更高版本。

macOS
macOS 10.11 (El Capitan) 及更高版本支持 TFO
Linux的

运行 Linux Kernel 3.7 或更高版本的 Linux 操作系统可以支持入站 TFO 连接。

运行 Linux Kernel 4.11 或更高版本的 Linux 操作系统可以支持入站和出站 TFO 连接。

设置 /proc/sys/net/ipv4/tcp_fastopen 的值以启用对入站和/或出站 TFO 连接的支持:

  • 设置为 1 以仅启用出站 TFO 连接。

  • 设置为 2 以仅启用入站 TFO 连接

  • 设置为 3 以启用入站和出站 TFO 连接。

MongoDB 4.4 添加了以下参数来控制 TFO:

参数
说明

默认值true(已启用)

启用或禁用对入站 TFO 连接的支持 mongod/mongos

默认值true(已启用)

仅 Linux 操作系统

启用或禁用对来自 mongod/mongos 的出站 TFO 连接的支持。

默认值1024

控制待处理的 TFO 连接队列的大小。

MongoDB 4.4 会在 serverStatusdb.serverStatus() 的输出中添加以下计数器:

计数器
说明

仅 Linux

表示内核对 TFO 的支持。

表示操作系统支持传入 TFO 连接。
指示操作系统支持传出 TFO 连接。
表示自 mongod/mongos 最后一次启动以来,mongod/mongos 接受的传入 TFO 连接总数。

对 TFO 的完整讨论超出了本文档的范围。有关 TFO 的更多信息,请参阅以下外部资源:

如果 MongoDB 无法使用一个或多个索引来获取给定 cursor.sort() 操作的排序顺序,则 MongoDB 必须对数据执行阻塞排序。阻塞排序表示 MongoDB 必须在返回结果之前消耗并处理排序的所有输入文档。阻塞排序不会阻塞对集合或数据库的并发操作。

MongoDB 4.4 之前,如果阻塞排序操作需要超过 32 MB 的系统内存,则 MongoDB 将返回错误。从 MongoDB 4.4 开始,阻塞排序操作会将用于排序操作的系统内存限制增加到 100 MB。对于需要超过 100 MB 系统内存的阻塞排序操作,除非查询指定了 cursor.allowDiskUse(),否则 MongoDB 会返回错误(MongoDB 4.4 新增)。

有关排序和索引使用的更多信息,请参阅排序和索引使用

MongoDB 4.4 在 find 命令中添加新选项 allowDiskUse。借助 allowDiskUse: true,在处理超过 100 兆字节内存限制的非索引(“blocking”)排序操作时,操作可以使用磁盘上的临时文件。在 MongoDB 4.4 之前,如果在处理排序过程中超过了内存限制,那么含阻塞排序的 find 操作就会失败。

针对含 db.collection.find()cursor.sort() shell 方法,MongoDB4.4 添加了 cursor.allowDiskUse() 光标修饰符。

如果 MongoDB 可以使用索引满足排序要求,或者阻塞排序需要的内存少于 100 MB,allowDiskUsecursor.allowDiskUse() 将不会产生任何影响。

有关如何为通过 MongoDB 驱动程序发出的查询启用 allowDiskUse 的说明,请参考您所选择的兼容 MongoDB 4.4 的驱动程序文档

从 MongoDB 4.4 开始,

未分片集合和视图的命名空间长度限制为 255 字节,分片集合的命名空间长度限制为 235 字节。对于集合或视图,命名空间包括数据库名称、点 (.) 分隔符和集合/视图名称(如 <database>.<collection>)。

$currentOpcurrentOp 命令包含用于正在进行的验证操作的 dataThroughputAveragedataThroughputLastSecond 信息。

验证操作的日志消息包括 dataThroughputAveragedataThroughputLastSecond 信息。

从 MongoDB 4.4 开始,compact 仅阻塞以下元数据操作:

compact 不会阻止其当前正在运行的数据库的 MongoDB CRUD 操作

以前,compact 会阻止其运行的数据库的所有操作,包括 MongoDB CRUD 操作,因此只适合在计划维护期间使用。

从 MongoDB 4.4 开始,force 标记会强制 compact副本集中的主节点上运行。

先前,force 选项设置为 true 时,compact 可以在副本集中的主节点上运行,若其设置为 false,则在主节点上运行时会返回错误信息。

提示

另请参阅:

从 MongoDB 4.4 开始,mongod --repair 会为以下内容重建所有索引:

  • 集合数据与一个或多个索引不一致的集合。

  • 已修复和修改的集合。

在 MongoDB 的早期版本中,mongod --repair 选项会为所有集合重建所有索引。

serverStatus 返回 flowControl.locksPerKiloOp 而不是 flowControl.locksPerOp

serverStatus 在其输出中包含以下新字段:

shardingStatistics.numHostsTargeted 报告 CRUD 操作和聚合命令所针对的分片数量。它会在集群上的每个操作中递增相关的查找、插入、更新、删除或聚合指标。

replSetGetStatus 返回以下新字段:

从 MongoDB 4.4 开始,如果不输入密码,mongo shell 方法 db.auth(<username>, <password>) 会提示输入密码;如果不输入密码,<password>passwordPrompt() 方法也会提示输入密码。

针对视图运行 find操作时,您可以指定 $natural 排序。

对于在 Linux 上运行的 MongoDB 实例:

  • mongodmongos 进程收到 SIGUSR2 信号时,回溯详细信息将添加到每个进程线程的日志中。

  • 回溯详细信息显示该进程的函数调用,可用于诊断并在需要时提供给 MongoDB 支持。

回溯功能可用于以下架构:

  • x86_64

  • arm64 (从 MongoDB 5.0.10 和 6.0 开始)

有关更多信息,请参阅生成回溯

从 MongoDB 4.4 开始,FTDC 现在可以从容器(而不是主机操作系统)的角度报告容器中运行的 mongod 的利用率数据。更多信息,请参阅全时诊断数据捕获

从 MongoDB 4.4 开始,如果平台配置的打开文件数的 ulimit 值低于64000,则 mongod 将会记录启动警告。以前,只有当该值低于 1000 时才会记录警告。有关更多信息,请参阅推荐的 ulimit 设置

MongoDB 4.4 将 replanReason 字段添加到数据库分析器输出诊断日志消息中replanReason 字段包含查询系统逐出缓存计划的原因。

dbStats 命令及其 mongo Shell 助手 db.stats() 返回:

collStats 命令、其mongo Shell 助手 db.collection.stats()$collStats 聚合阶段返回:

从 MongoDB 4.4 开始,以下数据库命令可以接受 hint 参数来指定要使用的索引:

请参阅:

从 MongoDB 4.4 开始,MongoDB 允许在 mongos 实例上执行 JavaScript。如要在 mongos 实例上禁用 JavaScript 执行:

在早期版本中,MongoDB 不允许在 mongos 实例上执行 JavaScript。

注意

需要 featureCompatibilityVersion 4.4+

副本集或分片群集中的每个 mongod必须featureCompatibilityVersion 设置为至少 4.4,才能配置全局默认读关注和写关注。

从 MongoDB 4.4 开始,副本集和分片集群支持配置全局默认读写关注设置。未显式指定给定读关注或写关注设置的客户端会继承相应的全局默认设置。

为了配置默认的全局默认读取或写关注,MongoDB 添加了 setDefaultRWConcern 管理命令。对于副本集,请针对主节点成员发出命令。对于分片集群,请从 mongos 发出命令。

为了检索全局默认读取或写关注设置,MongoDB 添加了 getDefaultRWConcern 管理命令。

从 MongoDB 4.4 开始,读关注对象可能包含一个 provenance 字段,指示读关注的来源。

下表显示了可能的读关注 provenance 值及其重要性:

来源
说明
clientSupplied
应用程序中指定了读关注问题。
customDefault
读关注源于一个自定义的默认值。参见 setDefaultRWConcern
implicitDefault
由于没有其他写关注规范,写关注源自服务器。

如果记录或分析读取操作,则操作条目包含读关注对象,包括 provenance 字段。

MongoDB 不建议在向服务器发出的请求中指定 provenance 字段。此字段只能用于诊断目的。

从 MongoDB 4.4 开始,写关注对象可以包含一个 provenance 字段,指示写关注的来源。

下表显示了可能的写关注 provenance 值及其重要性:

来源
说明
clientSupplied
应用程序中指定了写关注。
customDefault
写入关注源自自定义的默认值。请参阅 setDefaultRWConcern
getLastErrorDefaults
写关注源自副本集的 settings.getLastErrorDefaults 字段。
implicitDefault
在没有所有其他写入关注规范的情况下,写入关注源自服务器。

如果记录或分析了写入操作,则操作条目将包含写关注对象,包括 provenance 字段。

MongoDB 不建议在向服务器发出的请求中指定 provenance 字段。此字段只能用于诊断目的。

MongoDB 4.4 Enterprise 引入了两个新的配置设置来增强与 KMIP 服务器的初始连接,作为 Kerberos 身份验证的一部分:

要控制 mongod 重试与 KMIP 服务器的初始连接失败的次数,请执行以下操作:

控制等待 KMIP 服务器初始响应的超时时间(以毫秒为单位),然后再放弃或重试:

这些设置仅适用于 MongoDB Enterprise。

honorSystemUmask 设置为 false 时,mongod 新增的 processUmask 启动选项允许您通过 umask 为群组和其他用户设置权限。

从 MongoDB 4.4 开始,mapReduce 命令和 db.collection.mapReduce() shell 方法会忽略 verbose 选项。

从 MongoDB 4.4 开始,您可以使用 explain 命令或 db.collection.explain() shell 方法来预览 mapReducedb.collection.mapReduce() 的结果。

从版本 4.4 开始:

提示

另请参阅:

从 MongoDB 4.4 开始,所有数据库命令都支持按以下方式指定 comment 字段:

例子

db.runCommand( { <command> , "comment" : <any BSON type> })

设置后,该注释将与该命令的记录一起出现在以下位置:

注释必须是有效的 BSON 对象(string、整数、数组等)。

从 MongoDB 4.4 开始,当使用位置 $ 操作符时,您可以在查询文档和投影文档之间指定不同的数组字段。

例如,如果将以下文档插入到集合中:

db.foo.insertOne( { a: [ "one", "two", "three" ], b: [ 1, 2, 3 ] } )

从 MongoDB 4.4 开始,对于与字段 a 上指定的查询匹配的文档,您可以使用以下查询仅投影字段 b 中的第一个元素:

db.foo.findOne( { a: "one" }, { "b.$": 1 } )

重要

为确保达到预期行为,查询文档和投影文档中使用的数组必须具有相同长度。 如果数组的长度不同,在某些情况下操作可能会出错。

在 MongoDB 以前的版本中,该操作会失败,因为被限制的数组字段必须出现在查询文档中。

有些更改会影响兼容性,可能需要用户执行操作。如需兼容性变更的详细列表,请参阅 MongoDB 4.4 中的兼容性变更。

重要

特征兼容性版本

要从 4.2 部署升级,4.2 部署必须将 featureCompatibilityVersion 设置为 4.2。若要检查版本,您可以:

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

有关验证和设置 featureCompatibilityVersion 的具体详细信息,以及升级的其他先决条件/注意事项的详细信息,请参阅各个升级说明:

如需有关升级到 4.4 的指导,MongoDB 专业服务提供主要版本升级支持,帮助您顺利过渡,不会中断您的 MongoDB 应用程序。

MongoDB 仅支持单版本降级。您无法降级到比当前版本落后多个版本的版本。

例如,您可以将 4.4 系列降级为 4.2 系列部署。但是,不支持进一步降级该 4.2 系列部署到 4.0 系列部署。

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

提示

另请参阅:

版本中
问题
状态
4.4.0
SERVER-45042:MongoDB Server 安装程序 MSI(社区版和企业版)不再包含 MongoDB Database Tools 的二进制文件。有关更多信息,请参阅工具更改
未解决
4.4.0
SERVER-49694:在分片集群上,nearest读取或对冲读可能不会路由到附近的分片副本。
已在 4.4.1 中修复
4.4.0
WT-6623:设置恢复文件扫描中的连接级别文件 ID
已在 4.4.1 中修复

如要报告问题,请参阅 https://github.com/mongodb/mongo/wiki/Submit-Bug-Reports有关如何为 MongoDB 服务器或相关项目之一提交 JIRA 工单的说明,请参阅

后退

5.0 变更日志

来年

MongoDB 4.4 中的兼容性更改