MongoDB 4.4 发布说明
在此页面上
警告
补丁版本
4.4.29 - 2024 年 2 月 28 日
重要
修复 MongoDB Server 可能允许成功的不可信连接
由于 CVE-2024-1351,在 4.4.29 之前的 MongoDB 4.4 中, 在 --tlsCAFile
和CAFile
的某些配置下,MongoDB 服务器可能会跳过对等互连验证,这可能会导致不可信连接成功。
这可能会有效降低 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 :证书验证不正确
SERVER-70155 添加 oplog 槽位对 mongod "Slow query" 日志行保持打开状态的持续时间
SERVER-82353 movePrimary 同时运行时,多文档事务可能会丢失文档
SERVER-83564 确保在 config.locks 中对流程字段进行索引
SERVER-85536 [4 。4 ] 删除未索引的唯一部分索引项会产生写冲突
4 。 4 。 28 - 18 1 月, 2024
SERVER-77506 分片多文档事务可能会导致数据和 ShardVersion 不匹配
SERVER-82365 优化负载均衡器集合分布状态直方图的构造(第2 次尝试)
SERVER-82883 当参与者处于准备状态时,在升级时恢复 TransactionCoordinator 可能会阻止获取读/写票证
WT-7929 研究避免 FTDC 在检查点期间停止的解决方案
4 。 4 。 27 - 3 1 月, 2024
SERVER-63865 在非正常关闭后独立启动恢复期间处理缺失的索引标识
SERVER-81106 接收分片在开始克隆阶段之前不会等待集合版本在本地持久化
SERVER-81878 startupRecoveryForRestore 可能无法与启动恢复期间应用的集合删除良好配合
SERVER-82325 配置服务器在负载均衡器回合期间可能保持不变
WT-11564 修复 RTS 以仅读取检查点中存在的最新事务值
4 。 4 。 26 - 11 月27 , 2023
修复的问题:
SERVER-50792 当找不到 shardCollection 或 refinCollectionShardKey 的分片键索引时,返回更多有用的错误
SERVER-80021 使 $convert 在双精度和字符串之间正确往返
SERVER-81106 接收分片在开始克隆阶段之前不会等待集合版本在本地持久化
SERVER-81966 避免在刷新期间修改以前的 ChunkMap 实例
WT-10424 如果存在许多已删除项目, cursor::search_near 会降低性能
4 。 4 。 25 - 29 9 月, 2023
修复的问题:
SERVER-76299 在从节点上的 serverStatus 中报告 writeConflicts
SERVER-78828 排序期间 LDAP 主机计时数据可能不一致
WT-11031 修复 RTS 以跳过检查点中没有时间窗口信息的表
SERVER-70973 当没有可用的分片时,负载均衡器应停止迭代集合
SERVER-71627 当具有 百万数据段的集群时,刷新的缓存集合路由信息将严重阻止所有客户端请求1
SERVER-78813 提交点传播无限期失败,耗尽游标的 lastCommitted optime 为空
WT-8570 在恢复期间不要增加最旧的 ID
WT-10449 没有要写入历史记录存储的更新时,请勿保存更新链
4 。 4 。 24 - 23 8 月, 2023
修复的问题:
SERVER-76299 在从节点上的 serverStatus 中报告 writeConflicts
SERVER-78828 排序期间 LDAP 主机计时数据可能不一致
WT-11031 修复 RTS 以跳过检查点中没有时间窗口信息的表
4 。 4 。 23 - 7 月13 、 2023
SERVER-73943 在内存受限系统的内存中固定代码页
SERVER-75922 在 MongoDB4 04上创建的部分唯一索引。升级到2 后, 可能会缺少索引键。 及更高版本,会导致唯一性违规
SERVER-78126 对于特定类型的输入,mongo::Value() 在大端平台上始终会哈希得到相同的结果
4 。 4 。 22 - 5 月18 、 2023
SERVER-48196 将时间库升级到最新版本,将内置时区文件更新到最新版本
SERVER-57056 为 INFO 消息设置的系统日志严重性不正确
WT-10551 增量备份可能会遗漏已修改的区块
4 。 4 。 21 - 4 月27 、 2023
修复的问题:
SERVER-75261 “listCollections”命令失败,出现 BSONObjectTooLarge 错误
SERVER- 允许使用76098 $search 和非简单排序规则进行查询
4 。 4 。 20 - 4 月10 , 2023
修复的问题:
SERVER-51835 Mongos readPreferenceTags 未按预期运行
SERVER-74345 mongodb-org-server4 4195。 。 、 。0 。15 6、0 。5 。从旧版本(Debian、RPM 软件包)升级后, 未启动
SERVER-75205 当所有读取票证耗尽时,降级和释放锁后恢复之间的死锁
WT-9500 修复 RTS 以使用单元时间窗口而不是 HS 更新的键/值时间戳
4 。 4 。 19 - 2 月27 、 2023
修复的问题:
SERVER-68122 研究在初始同步期间复制集合 WiredTiger 配置字符串
SERVER-71759 dataSize 命令不会产生
SERVER-72222 在分片集群中合并结果时,具有单一 reduce 优化的 MapReduce 失败
SERVER-72535 分片集群允许使用备用大小写创建“admin”、“local”和“config”数据库
SERVER-70235 不要在 v 上创建范围删除文档。4 2-v4 .4 升级以防集合 uuid 不匹配
WT-9599 获取热备份锁以在区块管理器中调用 Fallocate
4 。 4 。 18 - 11 月21 , 2022
修复的问题:
SERVER-66289 $out 在 v 上错误地抛出 BSONObj5 0大小错误。 。8
SERVER-61185 使用 prefix_search 进行唯一索引查找
SERVER-68115 “elemMatchRootLength >0 ”不变触发器的错误修复
SERVER-50454 避免在出现重复键错误时向驱动程序发送“keyValue”字段
SERVER-69443 [4 。4 ] 当 --enableMajorityReadConcern=false 时,允许在多文档事务中进行推测性多数读取
4 。 4 。 17 - 28 9 月, 2022
修复的问题:
SERVER-68925 在启动时重新引入检查表日志记录设置(恢复 SERVER-43664 )
SERVER-56127 如果迁移了数据段并且分片键模式使用嵌套字段,则可重试更新可能会执行多次
SERVER-64142 将新的 EnforceUniqueness 添加到 ImproveCollectionShardKey 命令
SERVER-65382 AutoSplitVector 不应使用 clientReadable 对分片键字段重新排序
SERVER-61275 会话缓存关闭后销毁大小存储
WT-9870 修复在恢复期间更新最旧时间戳时更新固定时间戳的问题
4 。 4 。 16 - 19 8 月, 2022
修复的问题:
SERVER-67302 时钟更改时出现“Reading from replicationd collection without read timestamp or PBWM lock”崩溃
SERVER-61321 改进文本索引版本对大值/NaN 值的处理
SERVER-60607 改进对地理索引版本的大值/NaN 值的处理
SERVER-66418 由于字符串顺序假设,在依赖分析期间创建了错误的投影
WT-9096 修复当键不存在时搜索有时会返回错误的键/值的问题
4 。 4 。 15 - 21 6 月, 2022
修复的问题:
SERVER-66433 向后移植等待重叠范围删除完成的截止时间到 v 之前的 。5 1版本
SERVER-65821 在 setFCV 期间,如果准备好的事务尚未持久保存提交/中止决策,则会出现死锁
SERVER-65131 禁用机会性读取定位(对冲读除外)
SERVER-62272 向集合添加模式验证可以防止失败文档的数据段迁移
SERVER-54900 阻止网络调用会无限期延迟同步源解析
4 。 4 。 14 - 5 月9 、 2022
修复的问题:
SERVER-64983 在 TransactionParticipant::_resetTransactionState 中回滚 WT 事务之前释放客户端锁
SERVER-62229 修复在recoverFromOplogAsStandalone=true 时应用索引构建条目时的不变量
SERVER-60412 主机内存限制检查不支持 cgroups v2
SERVER-55429 在接收器未清理重叠范围时提前中止迁移
WT-8924 检查行存储中的冲突时,如果存在插入列表,请勿检查磁盘时间窗口
4 。 4 。 13 - 3 月7 、 2022
修复的问题:
SERVER-63203 如果找到超过 个分割点,则数据段分割器永远不会分割8192
SERVER-62065 从3 开始的升级路径。 改为6 4。0 可以在分片上留下没有历史记录的数据段条目
SERVER-59754 对于共享相同 $lookup 结构的操作,queryHash/planCacheKey 日志记录不正确
SERVER-55483 添加新的启动参数,跳过验证表日志设置
SERVER-40691 $nin:[...] 查询未编制索引
4 。 4 。 12 - 21 1 月, 2022
修复的问题:
SERVER-62203 将线程名称“运行状况检查进度监视器”更改为“FaultManagerProgressMonitor”
SERVER-61930 如果在执行单次运行状况检查时超时,单个运行状况观察器应返回错误
SERVER-61637 查看范围删除器批处理策略
SERVER-59362 设置故障管理器状态机
4 。 4 。 11 - 12 月30 、 2021
修复的问题:
WT-8395 从4 升级后,数据不一致。4 344。4 和4 。4 。 更改为 。 。8 + 和5 。0 。2 +
SERVER-60326 当 X 证书的主题名称为空时,Windows Server 无法启动509
SERVER-60310 OCSP 响应验证不应考虑不相关证书的状态
SERVER-59226 在配置文件会话标记为不间断的情况下退出时出现死锁
SERVER-56226 [v4 .4 ] 在 config.collections 条目上引入“permitMigrations”字段,以防止提交数据段迁移
SERVER-51329 关闭 mongos 服务器时出现意外的不可重试错误
SERVER-45953 免除 oplog 读取器获取读取票证的义务
4 。 4 。 10 - 10 月15 、 2021
修复的问题:
SERVER-59876 :建立出口连接时,从 libcrypto.so 返回存在较大延迟
SERVER-59867 :ReplSetConfig/MemberConfig 中的水平分割映射应确定性地序列化
SERVER-59456 :启动 LDAPReaper 线程池
SERVER-59074 :不要仅仅为了设置/等待 oplog 可见性而获取存储票证
SERVER-54064 :仲裁节点上的会话会累积且无法清除
4 。 4 。 9 - 21 9 月, 2021
修复的问题:
SERVER-57630 :在 Ubuntu 上启用 SSL_OP_NO_RENEGOTIATION。18 04(针对 OpenSSL1 1运行时)。 。1
SERVER-34938 :由于单个 oplog 批处理固定在缓存中的内容,导致从节点速度减慢或挂起
WT-8005 :修复了一个准备提交错误,该错误可能导致历史存储条目未解析
WT-7995 :修复全局可见性,使其无法超越检查点可见性
WT-7984 :修复可能导致检查点遗漏数据页的错误
4 。 4 。 8 - 4 8 月, 2021
修复的问题:
SERVER-58936 :可能不会强制执行唯一索引约束
SERVER-58258 :等待初始同步清除状态,然后再断言“replSetGetStatus”回复没有“initialSync”字段
SERVER-52906 :迁移失败后,回滚的 moveChunk 克隆索引可能会由于缺少分片键索引而无限期挂起
WT-7837 :清除 wt_hs_insert_updates 中的更新结构以避免触发断言
WT-6729 :在运行回滚到稳定版的活动事务检查之前停止逐出
4 。 4 。 7 - 7 月16 、 2021
修复的问题:
SERVER-57476 :在持有 oplog 槽时,操作可能会因准备冲突而受阻,从而无限期地停止复制
SERVER-56054 :将复制写入程序线程池的 minThreads 值更改为0
SERVER-53760 :$unwind + $sort 管道在溢出到磁盘时会产生大量文件句柄
SERVER-47699 :将范围删除器使用的让出类型从 YIELD_MANUAL 更改为 YIELD_AUTO
WT-7185 :避免在强制逐出事务且事务时间最旧的情况下中止该事务。
4 。 4 。 6 - 5 月10 、 2021
修复的问题:
SERVER-53604 :在身份验证审核日志中包含原始 aws iam arn
SERVER-52564 :降级和 MongoDOOperationContextSession 之间出现死锁
WT-7442 :RTS 仅当 dhandle 具有不稳定更新时才打开 dhandle
WT-7426 :创建页面映像时设置写入代数
WT-7373 :改进 oplog 上的慢速随机游标操作
4 。 4 。 5 - 4 月8 , 2021
修复的问题:
SERVER-55298 :重现并调查 BSONObjectTooLarge 错误
SERVER-53566 :调查并重现“opCtx != nullptr && _opCtx == nullptr”不变量
SERVER-51281 :mongod 实时锁定
SERVER-46686 :Explain 不遵循 maxTimeMS
SERVER-45836 :在默认日志级别提供更多 LDAP 详细信息(如服务器 IP)
4 。 4 。 4 - 2 月16 、 2021
修复的问题:
SERVER-48471 :哈希索引可能会被错误标记为多键,因此不符合作为分片键的条件
SERVER-50769 :服务器在 expr{"expr":"_currentApplyOps.getArrayLength() >0 ","file":"src/mongo/db/pipeline/document_source_change_stream_transform.cpp","line": 之后重新启动}535}}
SERVER-52919 :未为初始同步启用线路压缩
WT-7109 :保留不再支持的配置选项以实现向后兼容
WT-7117 :RTS 在恢复更新时跳过比磁盘上基础更新更新的修改
4.4.3 - 2021 年 1 月 4 日
修复的问题:
SERVER-33966 :聚合中的冗余 $sort 会阻止最佳 $limit $sort 合并
SERVER-40361 :减少计划缓存条目的内存占用
SERVER-52654 :新的签名密钥不是由 Monitoring-keys-for-HMAC 线程生成的
SERVER-52824 :支持带路径的 AWS 角色
SERVER-52929 :正确处理带有32 键的复合索引
4 。 4 。 2 - 11 月18 , 2020
修复的问题:
SERVER-48067 :减少使用大量非唯一键构建唯一索引的内存消耗
SERVER-48523 :尝试恢复变更流时,无条件检查 oplog 中的第一个条目
SERVER-50365 :卡在无法超时的长时间运行事务中
SERVER-50394 :mongod 审核日志将 DDL 操作归因于分片环境中的 __system 用户
SERVER-51041 :限制从节点读取的启动事务
SERVER-51120 :指定排序规则时,使用 MERGE_SORT 的查找查询会对结果进行错误排序
4 。 4 。 1 - 9 9 月, 2020
修复的问题:
SERVER-48531 :3 方式的死锁可能发生在数据段分割器、准备好的事务和降级线程之间。
SERVER-48641 :由于 MigrationDestinationManager 等待写关注且会话已签出而导致死锁
SERVER-49546 :将 FCV4 4设置为 。 应分批插入范围删除任务,而不是一次插入一个
SERVER-49694 :在分片集群上,最近读或对冲读可能不会路由到邻近分片副本。
SERVER-50137 :由于 中生成的 oplog 条目,MongoDB3 崩溃并导致不变故障。4
SERVER-50140 :初始同步无法在同步源非正常重启后幸存
SERVER-50170 :修复 mongos 上的服务器选择失败问题
WT-6623 :设置恢复文件扫描的连接级别文件 ID
全时诊断数据捕获要求
从版本4 4mongod
mongos
开始。 ,如果mongod
mongos
diagnostic.data
storage.dbPath
mongod
或 中的 全时诊断数据捕获 (FTDC) 线程失败,则会终止原始进程。为了避免出现最常见的故障,请确认运行systemLog.path
/ 用户有权在 (针对 )或与 (针对mongos
)。
聚合(Aggregation)
Union All( $unionWith
阶段)
MongoDB 4 。 4添加了$unionWith
聚合阶段,从而能够将多个集合的管道结果合并到单个结果集中。
有关详细信息,请参阅$unionWith
。
自定义聚合表达式(Custom Aggregation Expressions)
从版本4开始。 4 ,MongoDB 提供以下新操作符,允许用户定义自定义聚合表达式:
通过添加这些新操作符,您可以使用聚合来编写自定义 JavaScript 表达式,而不是依赖mapReduce
和$where
。
有关更多信息,请参阅Map-Reduce 到聚合管道。
新聚合操作符
Operator | 说明 |
---|---|
返回用户定义的累加器操作符的结果。 | |
返回给定字符串或二进制数据值内容的大小(以字节为单位)。 | |
以字节为单位返回给定文档(即 bsontype Object ) 的大小(当编码为 BSON 时)。 | |
定义自定义聚合表达式。 | |
替换给定输入中匹配字符串的第一个实例。 | |
替换给定输入中匹配字符串的所有实例。 |
常规聚合改进
$out
从 MongoDB 4.4 开始:
$out
仅当集群中所有节点都将 featureCompatibilityVersion 设置为4.4
或更高且“ 读取偏好” 允许从节点读取时, 才能在副本集从节点上运行。检查 驱动程序 文档,了解驱动程序何时添加了支持。
$indexStats
从 MongoDB 4开始。 4 (也可以从4 . 2 . 4开始), $indexStats
在其输出中包含以下字段:
$merge
从 MongoDB 4.4 开始:
$merge
仅当集群中所有节点都将 featureCompatibilityVersion 设置为4.4
或更高且“ 读取偏好” 允许从节点读取时, 才能在副本集从节点上运行。检查 驱动程序 文档,了解驱动程序何时添加了支持。
$merge
可以输出到正在聚合的同一collection。您还可以输出到管道其他阶段中出现的collection,例如$lookup
。
$planCacheStats
更改
从版本4开始。 4 、
$planCacheStats
阶段可以在mongos
实例和mongod
实例上运行。在4中。 2 、$planCacheStats
阶段只能在mongod
实例上运行。$planCacheStats
包括新字段:主机字段,以及针对mongos
运行时的分片字段。mongo
shell 提供PlanCache.list()
方法作为$planCacheStats
聚合阶段的包装器。MongoDB 删除以下内容:
planCacheListPlans
和planCacheListQueryShapes
命令,以及PlanCache.getPlansByQuery()
和PlanCache.listQueryShapes()
方法。
$collStats
更改
从 MongoDB 4开始。 4 、 $collStats
接受queryExecStats
字段作为参数文档。提供此字段会在输出中返回以下字段:
collectionScans
字段包含一个包含以下字段的嵌入式文档:
字段名称 | 说明 |
---|---|
total | 一个 64 位整数,表示执行collection扫描的查询总数。总数包括使用和未使用可追加游标的查询。 |
nonTailable | 一个 64 位整数,给出执行未使用可追加游标的集合扫描的查询数量。 |
explain
更改
从 MongoDB4 4开始。 ,当您在db.collection.explain().aggregate()
executionStats
和 模式下运行allPlansExecution
方法时, 解释输出 中列出的每个 管道阶段 都包括nReturned
和executionTimeMillisEstimate
。
副本集
可恢复的初始化同步 (Resumable Initial Sync)
从 MongoDB 4.4 开始,如果被暂时(即临时)网络错误、集合删除或集合重命名中断,从节点执行初始同步以尝试恢复同步进程。同步源还必须运行 MongoDB 4.4 以支持可恢复初始同步。如果同步源运行 MongoDB 4.2 或更早版本,从节点就像遇到非暂时性网络错误一样必须重启初始同步进程。
默认情况下,从节点会尝试在 24 小时内恢复初始同步。MongoDB 4.4 增加了 initialSyncTransientErrorRetryPeriodSeconds
服务器参数,用于控制从节点尝试恢复初始同步的时间长度。如果从节点无法在配置的时间段内成功恢复初始同步进程,则会从副本集中选择一个新的健康源,然后从头开始重新启动初始同步进程。
MongoDB 4之前的版本。 4 ,如果从节点在此过程中遇到错误,则会重新启动整个初始同步。
流复制 (Streaming Replication)
从 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 保留期
您可以指定保留 oplog 条目的最小小时数,其中mongod
仅当满足以下两个条件时才会删除 oplog 条目:
oplog 已达到最大配置大小。
oplog 条目早于根据主机系统时钟配置的小时数。
默认情况下,MongoDB 不设置最小 oplog 保留期,并自动从最旧的条目开始截断 oplog,以维持配置的 oplog 最大大小。
要在启动 mongod
时配置 oplog 最短保留期,请执行以下任一操作:
将
storage.oplogMinRetentionHours
设置添加到mongod
配置文件中。-或-
添加
--oplogMinRetentionHours
命令行选项。
要在正在运行的 mongod
上配置最短 oplog 保留期,请使用 replSetResizeOplog
。在 mongod
运行时设置最短 oplog 保留期会覆盖启动时设置的任何值。您必须更新相应配置文件设置或命令行选项的值,才能在服务器重启后继续保持这些更改。
重要
oplog 的大小可以不受限制地增长,以便在配置的小时数内保留 oplog 条目。由于写入量高且保留期长,这可能会导致系统磁盘空间减少或耗尽。
提示
另请参阅:
slowOpSampleRate
影响从节点日志
从 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()
中。
要修改正在进行的索引构建所需的法定人数,请使用 MongoDB 4 。 4引入了新的setIndexCommitQuorum
命令。
有关详细信息,请参阅复制环境中的索引构建。
副本集重新配置更改
更改为 replSetReconfig
从 MongoDB4 4开始。 ,replSetReconfig
命令会等到大多数投票成员安装副本配置,然后再返回成功。投票成员是 为 的 members[n].votes
任何1
副本成员,包括仲裁节点。首先,该操作会等到提交 当前 配置,然后再在主节点上安装 新 配置。然后,该操作会等到大多数投票成员安装 新 配置,然后再成功返回。有关更多信息,请参阅 重新配置等到大多数成员安装副本集配置 。
replSetReconfig
默认情况下, 会无限期等待大多数投票成员安装配置。 MongoDB4 。4 还为 添加了可选的 maxTimeMS replSetReconfig
参数,用于指定等待操作成功返回的最长时间。
从 MongoDB 4开始。 4 , replSetReconfig
命令允许一次添加或删除不超过1
voting
成员。要添加或删除多个投票成员,请发出一系列replSetReconfig
或rs.reconfig()
操作,一次添加或删除一个成员。有关更多信息,请参阅重新配置只能添加或删除不超过一个投票节点。
更改为 replSetGetConfig
在主节点上运行时, replSetGetConfig
命令可以指定新选项CommitmentStatus: true 。使用该选项运行时,该命令会在输出中包含commitmentStatus字段。此输出字段指示副本集之前的重新配置是否已提交,以便副本集准备好再次重新配置。有关更多信息,请参阅replSetGetConfig命令。
对副本配置文档的更改
MongoDB 4 。 4将term
字段添加到副本集配置文档中。副本集节点使用term
和version
就“最新”副本配置达成共识。设置featureCompatibilityVersion (fCV) : " 4 . 4 "会隐式执行replSetReconfig
,以将term
字段添加到配置文档中,并且会阻塞,直到新配置传播到大多数副本集成员。同样,降级到fCV : "4.2"
会隐式执行重新配置以删除term
字段。
首选初始同步源
从 MongoDB 4开始。 4 ,您可以使用initialSyncSourceReadPreference
参数指定首选初始同步源。您只能在mongod
启动时使用setParameter
配置文件设置或--setParameter
命令行选项来设置此参数。
initialSyncSourceReadPreference
支持以下读取偏好模式:
primaryPreferred
(投票副本集成员的默认值)nearest
(新增或无投票权的副本集成员的默认值)
如果副本集已禁用chaining
,则默认的initialSyncSourceReadPreference
读取偏好模式为primary
。
您不能为 指定标签集或maxStalenessSeconds
initialSyncSourceReadPreference
。
提示
另请参阅:
镜像读取 (Mirrored Reads)
从版本 4.4 开始,MongoDB 使用最近访问的数据提供镜像读,以预热可选举从节点的缓存。通过镜像读,主节点可以镜像其接收的一部分操作,并将其发送到可选举从节点的子集。预热从节点的缓存有助于在选举后更快地恢复性能。
注意
主节点对客户端的响应不受镜像读取的影响。镜像读是主节点执行的“即发即弃”操作;即,主节点不等待镜像读的响应。
镜像读参数
MongoDB 4 。 4添加了以下镜像读参数。您可以使用setParameter
配置文件设置或--setParameter
命令行选项在启动时设置参数,也可以使用setParameter
命令在运行时设置参数:
范围 | 说明 |
---|---|
指定镜像读的
|
镜像读取指标
如果在操作中指定包含该字段,则命令serverStatus
及其相应的mongo
Shell 方法db.serverStatus()
将返回mirroredReads
:
db.runCommand( { serverStatus: 1, mirroredReads: 1 } )
或
db.serverStatus( { mirroredReads: 1 } )
分片集群
可优化的分片键 (Refinable Shard Keys)
从4开始。 4 ,MongoDB 提供refineCollectionShardKey
命令。使用新命令,您可以通过向现有键添加一个或多个后缀字段来优化集合的分片键。细化集合的分片键可以实现更细粒度的数据分布,并且可以解决现有键由于关联基数不足而导致巨型(即不可分割)数据段的情况。
例如,您可能有一个带有分片键{ customer_id: 1 }
的现有orders
集合。您可以通过在分片键中添加后缀order_id
字段来更改分片键,以便{
customer_id: 1, order_id: 1 }
成为新的分片键,从而允许按customer_id
和order_id
字段分发数据。
要使用refineCollectionShardKey
命令,分片集群的特征兼容性版本 (fcv)必须为4.4
。有关更多信息,请参阅refineCollectionShardKey
命令。
注意
优化分片键后,可能并非集合中的所有文档都具有后缀字段。要填充缺失的分片键字段,请参阅缺失的分片键字段。
在优化分片键之前,如果可能,请确保集合中的所有或大多数文档都具有后缀字段,以避免事后必须填充该字段。
在早期版本中,一旦选择了分片键,就无法修改该键。
重要
缺少分片键
由于能够使用后缀优化分片键,因此可能并非集合中的所有文档都具有后缀字段。从版本4开始。 4 ,分片集合中的文档可能缺少分片键字段。在早期版本中,分片集合的每个文档中必须存在分片键字段。有关详细信息,请参阅缺少分片键字段。
对冲读 (Hedged Reads)
为了最大限度地减少延迟,默认情况下,mongos
实例可以使用 对冲读 。通过对冲读,mongos
实例可以将读取操作路由到每个查询分片的多个成员,并从每个分片的第一个响应者返回结果。默认情况下,mongos
实例支持使用对冲读。要关闭mongos
实例对冲读的支持,请为readHedgingMode
设置mongos
参数。
对冲读是针对每个操作指定的,作为读取偏好的一部分。非primary
读取偏好支持对冲读。读取偏好nearest
默认指定对冲读。
有关更多信息,请参阅:
对冲读参数
范围 | 说明 |
---|---|
启用或禁用 mongos 实例对对冲读的支持。 | |
针对读取偏好的对冲读取选项
要为读取偏好指定对冲读,MongoDB 4 。 4引入了对冲读选项。要设置为使用 MongoDB 驱动程序,请参阅驱动程序读取偏好 API 文档。
以下mongo
Shell 方法可以接受对冲选项,以为指定的读取偏好启用对冲读:
对冲读指标
命令serverStatus
及其相应的mongo
Shell 方法db.serverStatus()
返回hedgingMetrics
。
balancerCollectionStatus
命令
MongoDB 4 。 4提供命令balancerCollectionStatus
和mongo
Shell 助手方法sh.balancerCollectionStatus()
,该方法返回有关在命令运行时分片集合的数据段是否平衡(即不需要移动)的信息或需要移动。使用该命令,用户可以验证初始数据段创建和迁移是否已完成。
改进的mongos
启动过程
从 MongoDB 4开始。 4 、 mongos
添加了以下新的默认启动行为:
此行为可在启动或重新启动mongos
实例后加快为初始客户端连接提供服务的速度。特别是,这允许使用多个mongos
实例的站点根据需要重新启动这些实例或添加新实例,而不需要向这些实例发送初始客户端请求,因为这些实例需要等待连接建立。
默认情况下,路由表预加载和连接池预热均处于启用状态。
MongoDB 4 。 4添加了以下参数来控制此行为:
默认值:
true
(已启用)启用或禁用对
mongos
启动时预加载路由表的支持。
warmMinConnectionsInShardingTaskExecutorPoolOnStartup
默认值:
true
(已启用)启用或禁用对
mongos
启动时预热连接池的支持。
warmMinConnectionsInShardingTaskExecutorPoolOnStartupWaitMS
默认值:
2000
( 2秒)设置超时时间(以毫秒为单位),然后无论已建立的连接池大小如何,都允许客户端连接到
mongos
。
改进路由表更新
flushRouterConfig
执行movePrimary
或dropDatabase
命令后,不再需要运行 。现在,这两个命令会在运行时根据需要自动刷新分片集群的路由表。在flushRouterConfig
flushRouterConfig 注意事项 中描述的情况下,仍然建议手动发出 命令。
组合哈希分片键 (Compound Hashed Shard Keys)
从 MongoDB 4开始。 4 ,您可以使用带有单个哈希字段的复合分片键对集合进行分片。在4之前。 4 ,MongoDB 不支持带有哈希字段的复合分片键。
复合哈希分片支持区域分片等功能,其中前缀(即第一个)非哈希字段支持区域范围,而哈希字段支持更均匀的分片数据分布。例如,以下操作根据支持分区分片的复合哈希分片键对集合进行分片:
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 提供了以下参数:
范围 | 说明 |
---|---|
启用或禁用索引一致性检查。 | |
配置服务器的主节点检查分片集合的索引一致性的时间间隔。 |
并发removeShard
操作
从 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
。
自动拆分system.sessions
集合
从版本4开始。 4 (以及4 . 2 . 7 )时,MongoDB 会自动将system.sessions
集合分割为至少1024数据段,并将这些数据段均匀地分布在集群中的各个分片上。
投射
从 MongoDB 4.4 开始,作为使find()
和findAndModify()
投影与聚合的$project
阶段保持一致的一部分,
find()
和findAndModify()
投影可以接受聚合表达式和聚合语法,包括使用文字和聚合变量。通过使用聚合表达式和语法,您可以投影新字段或使用新值投影现有字段。find()
和findAndModify()
投影可以使用嵌套形式指定嵌入式字段;例如{ field: { nestedfield: 1 } }
以及点表示法。在早期版本中,只能使用点表示法。
有关更多信息,请参阅:
提示
另请参阅:
$meta
Operator
$meta
关键字支持
从 MongoDB 4开始。 4 , $meta
操作符添加了对检索indexKey
元数据的支持。 indexKey
元数据仅用于调试目的,不适用于应用程序逻辑。有关更多信息,请参阅$meta
。
{ $meta: "textScore" }
用法与 find()
从版本4开始。 4 ,与 db.collection.find()
一起使用时,MongoDB 会进行以下{ $meta: "textScore" }
更改
您必须在查询谓词中指定
$text
操作符才能使用{ $meta: "textScore" }
。您可以按搜索相关性(即
{ $meta: "textScore" }
)对结果文档进行排序,而无需同时投影textScore
。在早期版本中,要在sort()
中包含{ $meta: "textScore" }
表达式,还必须在投影中包含相同的表达式。如果在投影和排序中都包含
{ $meta: "textScore" }
表达式(即db.collection.find(<$text search>, <projection>).sort(<sort>)
,则投影和排序文档可以针对该表达式具有不同的字段名称。在 MongoDB 的早期版本中,如果在投影和排序中都包含{ $meta: "textScore" }
,则必须在这两个位置指定相同的字段名称。
有关详细信息,请参阅文本分数元数据$meta: "textScore"
。 有关"textScore"
投影和排序的示例,请参阅文本搜索分数示例。
事务
从 MongoDB 4开始。 4具有功能兼容性版本 (fcv) "4.4"
,您可以在多文档事务中创建集合和索引,除非该事务是跨分片写事务。
在事务中创建集合时:
您可以隐式创建一个集合,例如:
针对不存在的集合的插入操作;
针对不存在的集合使用
upsert: true
执行 update/findAndModify 操作。
您可以使用
create
命令或其助手db.createCollection()
显式创建集合。如果针对
db.createCollection()
系统集合 执行, 方法将失败。
在事务中创建索引时:
您可以在不存在的集合上创建索引。集合是作为操作的一部分创建的。
您可以在先前在同一事务中创建的新空集合上创建索引。
如果针对
db.collection.createIndex()
系统集合 执行, 方法将失败。
有关更多详细信息,请参阅在事务中创建集合和索引。
MongoDB 4 。 4添加了一个新参数shouldMultiDocTxnCreateCollectionAndIndexes
,该参数可以启用(默认)或禁用事务内的集合和索引创建。为分片集群设置参数时,请在所有分片上设置该参数。
要在事务内显式创建集合或索引,事务读关注级别必须为 "local"
。显式创建通过以下方式实现:
排序
$sort
更改
从 MongoDB 4开始。 4 , sort()
方法现在使用与$sort
聚合阶段相同的排序算法。进行此更改后,对包含重复值的字段执行sort()
的查询更有可能导致这些值的排序顺序不一致。
对重复值使用sort()
时,为保证排序一致性,请在排序中包含一个额外字段,其中仅包含唯一值。
通过在排序中添加_id
字段,可以轻松完成此操作。
有关更多信息,请参阅排序一致性。
安全改进
新的 Kerberos 验证工具 mongokerberos
MongoDB Enterprise 4 。 4提供了一个新的mongokerberos
工具,用于验证平台的 Kerberos 配置是否与 MongoDB 一起使用,以及通过 Kerberos 测试端到端客户端身份验证。运行时, mongokerberos
会返回一份报告,说明遇到的任何问题,并提供解决这些问题的潜在建议。 mongokerberos
仅在 MongoDB Enterprise 中可用。
OCSP
从版本4开始。 4 ,MongoDB 默认启用 OCSP(在线证书状态协议)来检查证书吊销情况。使用 OCSP 后,无需定期下载Certificate Revocation List (CRL)
并使用更新的 CRL 重新启动mongod
/ mongos
。
在版本 4.0 和 4.2 中,只能通过在 Windows 或 macOS 上使用 system certificate store
来使用 OCSP。
提示
另请参阅:
OCSP 装订/必须装订
作为 OCSP 支持的一部分,MongoDB 4 . 4在 Linux 上支持以下内容:
OCSP 装订 。通过 OCSP 装订,
mongod
和mongos
实例可在 TLS/SSL 握手期间向客户端提供这些证书时,将 OCSP 状态响应附加或“装订”到其证书中。通过将 OCSP 状态响应包含在证书中,OCSP 装订使客户端无需单独发出请求来检索所提供证书的 OCSP 状态。OCSP 必备装订扩展 。 OCSP 必须装订是一个可以添加到服务器证书中的扩展,它告诉客户端在 TLS/SSL 握手期间接收证书时需要 OCSP 装订。
OCSP 参数
MongoDB 4 。 4添加了以下 OCSP 参数。您可以使用setParameter
配置文件设置或--setParameter
命令行选项在启动时设置这些参数:
范围 | 说明 |
---|---|
启用或禁用 OCSP 支持。 | |
指定在刷新装订的 OCSP 状态响应之前等待的秒数。 | |
x。 509证书即将过期触发警告
从 MongoDB 4开始。如果提供的 x,则4 、 mongod
/ mongos
会记录连接警告。 509证书将在mongod/mongos
系统时钟后的30
天内过期。具体来说,与mongod
或mongos
的以下连接可以触发 x。 509证书过期警告:
使用MongoDB 驱动程序建立TLS 连接或执行x的
mongo
Shell 或应用程序。 509客户端身份验证,使用的证书将在30天内过期。 (即为--tlsCertificateKeyFile
或tlsCertificateKeyFile
指定的证书)。一个
mongod
集群成员正在执行x. 509成员身份验证,证书将在30天内过期。 (即指定为net.tls.clusterFile
、net.tls.clusterCertificateSelector
、mongod --tlsClusterFile
或mongod --tlsClusterCertificateSelector
的证书)。一个
mongos
集群成员正在执行x. 509成员身份验证,证书将在30天内过期。 (即为net.tls.clusterFile
、net.tls.clusterCertificateSelector
、mongos --tlsClusterFile
或mongos --tlsClusterCertificateSelector
指定的证书)。
警告日志消息类似于以下内容:
<Timestamp> W NETWORK [connection] Peer certificate <Certificate Subject Name> expires...
考虑主动续订客户端 x。 509证书即将过期,以确保与集群的持续连接。
MongoDB 4 。 4添加了tlsX509ExpirationWarningThresholdDays
参数,用于控制证书过期警告阈值。将该参数设置为0
以禁用警告。有关完整文档,请参阅tlsX509ExpirationWarningThresholdDays
。
TLS 1 。 3支持
在 CentOS 8和 RHEL 8上,MongoDB 4 。 4 (以及版本4 . 2 、 4 . 0和3 . 6 )支持 TLS 1 。 3 。
网络或身份验证失败时用户到 DN 映射的退出
如果由于 LDAP 服务器网络或身份验证失败而无法评估某一用户到标识名 (DN) 的映射,则mongod
、 mongos
或mongoldap
会返回错误。
mongod
、 mongos
或mongoldap
会拒绝连接请求,并且不检查剩余映射(如果有)。
要指定用户到 DN 映射,请参阅:
结构化日志
从 MongoDB 4开始。 4 、 mongod
/ mongos
实例现在以结构化 JSON 格式输出所有日志消息。日志条目被写入一系列键值对中,其中每个键表示一个日志消息字段类型,例如“严重性”,每个对应的值记录该字段类型的关联日志信息,例如“信息性”。
这包括发送到文件、系统日志和stdout (标准输出)日志目标的日志输出,以及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。
有关结构化日志记录的更多信息,包括日志条目组件的详细检查以及命令行解析示例,请参阅日志消息。
多 LDAP 密码支持
从 MongoDB 4开始。 4 , ldapQueryPassword
setParameter
命令接受字符串或字符串数组。如果设置为数组,则会尝试每个密码,直到有一个密码成功为止。这可用于在不停机的情况下对 MongoDB 执行 LDAP 帐户密码轮换。
平台支持
新增平台
MongoDB 4 。 4增加了对以下平台的支持:
已删除的平台
MongoDB 4 。 4删除了对以下平台的支持:
Amazon Linux 2013 。 03
s390 x 架构上的 RHEL6 / CentOS6 / Oracle6
Windows 7 / Server 2008 R 2
Windows 8 / Server 2012
Windows 8 。 1 / 服务器2012 R 2
macOS 10 。 12
有关 MongoDB 4支持的平台和架构的完整列表,请参阅平台支持。 4 。
Mongo Shell
Mongo Shell 支持 Atlas 集群的 AWS IAM 档案
从 MongoDB4 开始。4 ,mongo
Shell 支持使用 AWS IAM 档案 对已配置 AWS IAM 身份验证的 MongoDB Atlas 集群进行身份验证。
以这种方式进行身份验证会使用新的MONGODB-AWS
authentication mechanism
,并要求您提供 AWS 访问密钥 ID 和秘密访问密钥,可以在连接字符串中指定或在命令行上通过--username
和--password
选项。
此外,如果您使用的是 AWS 会话令牌 用于在使用 AssumeRole 时使用临时凭证进行身份验证 请求,或者在使用指定此值的 AWS 资源(例如 Lambda)时,您可以使用AWS_SESSION_TOKEN
authMechanismProperties
值在连接字符串中提供该会话令牌,或在命令行中通过--awsIamSessionToken
选项提供该会话令牌。
或者,如果 AWS 访问密钥 ID、秘密访问密钥或会话令牌是使用各自的 AWS IAM 环境变量 在您的平台上定义的mongo
Shell 使用这些环境变量值进行身份验证;您不需要在连接字符串中指定它们。
有关用法,请参阅连接字符串身份验证选项;有关示例,请参阅使用 MONGODB-AWS 连接到 Atlas 集群。
工具
迁移到 MongoDB Database Tools 项目
从 MongoDB 4开始。 4 ,以下工具的文档已迁移到MongoDB Database Tools 项目:
MongoDB 数据库工具使用 Apache 许可证版本2 0。 。请参阅 mongodb/mongo-tools 以获取源代码。
注意
新的mongokerberos
Kerberos 验证工具
MongoDB Enterprise 4 。 4提供了一个新的mongokerberos
工具,用于验证平台的 Kerberos 配置是否与 MongoDB 一起使用,以及通过 Kerberos 测试端到端客户端身份验证。运行时, mongokerberos
会返回一份报告,说明遇到的任何问题,并提供解决这些问题的潜在建议。 mongokerberos
仅在 MongoDB Enterprise 中可用。
有关更多信息,请参阅mongokerberos
参考页。
mongoreplay
已从 MongoDB 打包中删除
从 MongoDB4 开始。4 、mongoreplay
已从 MongoDB 打包中删除。mongoreplay
及其相关文档已迁移到 mongodb-labs github 项目。mongodb-labs
中的项目是实验性的,MongoDB 并未提供正式支持。
指向较旧文档的快速链接
MongoDB 数据库工具未随 Windows MSI 打包
Community 版和 Enterprise 版的Windows MSI 安装程序不包含MongoDB Database Tools ( mongoimport
、 mongoexport
等)。要在 Windows 上下载并安装 MongoDB Database Tools,请参阅安装 MongoDB Database Tools。
如果您依赖 MongoDB 4 . 2或以前的 MSI 安装程序将 Database Tools 与 MongoDB Server 一起安装,现在您必须单独下载 Database Tools。
驱动程序
新驱动程序
官方MongoDB Rust 驱动程序现已发布。
官方MongoDB Swift 驱动程序现已发布。
索引
复合哈希索引
MongoDB 4 。 4添加了对使用单个哈希字段创建复合索引的支持。 MongoDB 4 。 2及更早版本仅支持单字段哈希索引。
以下操作在country
和_id
上创建复合哈希索引:
db.examples.createIndex( { "country" : 1, "_id" : "hashed" } )
复合哈希索引需要将 featureCompatibilityVersion设置为4.4
。
隐藏索引 (Hidden Indexes)
从版本4开始。 4 ,MongoDB 添加了对查询规划器隐藏或取消隐藏索引的功能。对查询规划器隐藏的索引不会作为查询计划选择的一部分进行评估。
通过向规划器隐藏索引,您可以评估删除索引的潜在影响,而无需删除索引。如果影响是负面的,您可以取消隐藏索引,而不必重新创建已删除的索引。由于索引在隐藏时得到完全维护,因此一旦取消隐藏,隐藏的索引就可以立即使用。
有关详情,请参阅隐藏索引。
为了支持隐藏索引,MongoDB 引入了:
新的索引选项
hidden
。可以在以下操作中指定该选项:用于隐藏或取消隐藏现有索引的新
mongo
Shell 助手方法:
dropIndexes
可以中止正在进行的索引构建
如果为dropIndexes
指定的索引仍在构建中, dropIndexes
会尝试中止正在进行的构建。中止索引构建与删除构建的索引具有相同的效果。在 MongoDB 4之前。 4中,如果集合有任何正在进行的索引构建, dropIndexes
将返回错误。此行为也适用于 Shell 助手db.collection.dropIndex()
和db.collection.dropIndexes()
。
指定给
dropIndexes
/dropIndexes()
的索引必须是与给定索引构建器关联的整个正在进行的构建集,即由单个createIndexes
或db.collection.createIndexes()
操作构建的索引。为
dropIndex()
指定的索引必须是与索引构建器关联的唯一索引,即由单个createIndexes
或db.collection.createIndexes()
操作构建的索引。
要从一组相关的进行中的构建中删除特定索引,请等待索引构建完成,然后为dropIndexes
或其 Shell 助手指定该索引。
有关更完整的文档,请参阅:
停止
dropIndexes
命令正在进行的索引构建。停止
dropIndexes()
方法 正在进行的索引构建 。停止
dropIndex()
方法 正在进行的索引构建 。
drop()
可以中止正在进行的索引构建
在删除collection之前, db.collection.drop()
方法和drop
命令会中止在目标collection上任何正在进行的索引构建。
对于副本集或分片副本集,中止主节点上的索引不会同时中止从节点索引构建。MongoDB 尝试中止主节点上指定索引正在进行的构建。如果成功,则会创建关联的 abort
oplog 条目。从节点如果有正在进行的构建的副本,则在提交或中止索引构建之前会等待来自主节点的提交或中止 oplog 条目。
对于副本集或分片副本集,中止主节点上的索引不会同时中止从节点索引构建。MongoDB 尝试中止主节点上指定索引正在进行的构建。如果成功,则会创建关联的 abort
oplog 条目。从节点如果有正在进行的构建的副本,则在提交或中止索引构建之前会等待来自主节点的提交或中止 oplog 条目。
dropDatabase
可以中止正在进行的索引构建
在删除数据库之前, db.dropDatabase()
方法和dropDatabase
命令会中止任何正在进行的基于目标数据库中collection的索引构建。中止索引构建与删除构建的索引具有相同的效果。
提示
另请参阅:
弃用geoHaystack
索引和geoSearch
命令
MongoDB 4 。 4弃用了geoHaystack索引和geoSearch
命令。请改用带有$geoNear
或$geoWithin
的2 d 索引。
已删除的命令
MongoDB 删除以下命令和mongo
Shell 助手:
已删除的命令 | 已删除助手 | 替代品 |
---|---|---|
cloneCollection | db.cloneCollection() |
|
planCacheListPlans | PlanCache.getPlansByQuery() |
另请参阅 $planCacheStats 更改。 |
planCacheListQueryShapes | PlanCache.listQueryShapes() |
另请参阅 $planCacheStats 更改。 |
网络
支持 TCP 快速打开
从 MongoDB 4开始。 4 、 mongod
和mongos
默认支持 TCP 快速打开 (TFO) 连接。 TFO 要求客户端和mongod/mongos
主机都支持并启用 TFO:
- Windows
以下 Windows 操作系统支持 TFO:
Microsoft Windows Server 2016或更高版本。
Microsoft Windows 10 Update 1607或更高版本。
- macOS
- macOS 10 。 11 (El Capitan) 及更高版本支持 TFO
- Linux
运行 Linux 内核3的 Linux 操作系统。 7或更高版本可支持入站 TFO 连接。
运行 Linux 内核4的 Linux 操作系统。 11或更高版本可支持入站和出站 TFO 连接。
设置
/proc/sys/net/ipv4/tcp_fastopen
的值以启用对入站和/或出站 TFO 连接的支持:设置为
1
以仅启用出站 TFO 连接设置为
2
以仅启用入站 TFO 连接设置为
3
以启用入站和出站 TFO 连接。
MongoDB 4 。 4添加了以下用于控制 TFO 的参数:
范围 | 说明 |
---|---|
默认值: 启用或禁用对入站 TFO 连接的支持
| |
默认值: 仅 Linux 操作系统 启用或禁用对来自 | |
默认值: 控制待处理 TFO 连接队列的大小。 |
MongoDB 4 。 4将以下计数器添加到serverStatus
和db.serverStatus()
的输出:
计数器 | 说明 |
---|---|
仅 Linux 表示内核对 TFO 的支持。 | |
指示操作系统对传入 TFO 连接的支持。 | |
表示操作系统对传出 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 )。
有关排序和索引使用的更多信息,请参阅排序和索引使用。
提示
find
可以使用临时文件支持大型非索引排序
MongoDB4 4。find
向 命令添加了一个新选项 allowDiskUse 。通过使用 allowDiskUse: true ,在处理超过 MB 内存限制的非索引(“阻塞”) 排序100 操作时,操作可以使用磁盘上的临时文件。在 MongoDB 之前。 ,如果在处理排序时超出内存限制,则具有阻塞排序的4 4find
操作会失败。
对于带有 和db.collection.find()
cursor.sort()
MongoDB4 4的cursor.allowDiskUse()
shell 方法。 添加 游标修饰符。
cursor.allowDiskUse()
如果 MongoDB 可以满足使用 索引 的排序, 或者 阻塞排序需要少于100 MB 的内存,则 allowDiskUse 和 不起作用。
有关为通过 MongoDB 驱动程序发出的查询启用allowDiskUse的说明,请参阅您首选MongoDB 4的文档。 4兼容驱动程序。
集合命名空间限制
从 MongoDB 4开始。 4 、
未分片collection和视图的命名空间长度限制为255字节,分片collection的命名空间长度限制为235字节。对于collection或视图,命名空间包括数据库名称、点 ( .
) 分隔符和collection/视图名称(例如<database>.<collection>
)。
验证数据吞吐量信息
$currentOp
和 currentOp
命令包含用于正在进行的验证操作的 dataThroughputAverage
和 dataThroughputLastSecond
信息。
验证操作的日志消息包括 dataThroughputAverage
和 dataThroughputLastSecond
信息。
提示
compact
行为变更
阻塞
从 MongoDB 4开始。 4 、 compact
仅阻止以下元数据操作:
compact
不会阻止当前正在操作的数据库的MongoDB CRUD 操作。
以前, compact
会阻止其正在操作的数据库的所有操作,包括MongoDB CRUD 操作,因此仅适合在计划维护期间使用。
force
选项
从 MongoDB4 开始。4 ,force
compact
标志会强制 在 副本集中 的 主 节点上运行。
force
以前,如果将true
compact
选项设置为false
,则 可以在 副本集中 的 主 节点上运行;如果设置为 ,则会在 主节点上运行时返回错误。
提示
另请参阅:
mongod --repair
行为变更
从 MongoDB 4开始。 4后, mongod --repair
会为以下内容重建所有索引:
集合数据与一个或多个索引不一致的集合。
已挽救和修改的集合。
在 MongoDB 的早期版本中, mongod --repair
选项会为所有集合重新构建所有索引。
serverStatus
输出变化
字段名称更改
serverStatus
返回flowControl.locksPerKiloOp
而不是flowControl.locksPerOp
。
新字段
serverStatus
在其输出中包含以下新字段:
聚合指标
metrics.aggStageCounters
(也适用于4 . 2 . 6 + 和4 . 0 . 19 +)
连接指标
默认读关注写关注指标
闩锁指标
镜像读取指标
查询执行指标
复制指标
网络指标
安全度量
分片指标
serverStatus
分片统计信息输出更改
shardingStatistics.numHostsTargeted
报告 CRUD 操作和聚合命令所针对的分片的数量。它会随着集群上的每个操作而递增相关的查找、插入、更新、删除或聚合指标。
replSetGetStatus
输出变化
replSetGetStatus
返回以下新字段:
db.auth() 可以提示输入密码
从 MongoDB 4开始。 4中,如果您没有传入密码, mongo
Shell 方法db.auth(<username>, <password>)
会提示您输入密码,也没有为<password>
传入passwordPrompt()
方法。
支持$natural
对视图进行排序
支持诊断回溯生成
对于在 Linux 上运行的 MongoDB 实例:
回溯功能可用于以下架构:
x86_64
arm64
(从 MongoDB 5 . 0 . 10和6 . 0开始)
有关更多信息,请参阅生成回溯。
容器感知 FTDC 报告
从 MongoDB 4开始。 4 , FTDC现在从容器(而不是主机操作系统)的角度报告在容器中运行的mongod
的利用率数据。有关更多信息,请参阅全时诊断数据捕获。
更新了ulimit
启动警告
从 MongoDB 4开始。 4中,如果平台为打开文件数配置的ulimit
值低于64000
,则mongod
会记录启动警告。以前,仅当该值低于1000
时才会记录警告。有关更多信息,请参阅推荐的ulimit
设置。
新的replanReason
数据库分析器输出字段
MongoDB 4 。 4将replanReason
字段添加到数据库分析器输出和诊断日志消息中。 replanReason
字段包含查询系统逐出缓存计划的原因。
dbStats
和collStats
输出
dbStats
命令及其mongo
Shell 助手db.stats()
返回:
collStats
命令、其mongo
Shell 助手db.collection.stats()
和$collStats
聚合阶段返回:
freeStorageSize
,这是可供重复使用的存储量。
可用于其他数据库命令的提示
从 MongoDB 4开始。 4 ,以下数据库命令可以接受hint
参数来指定要使用的索引:
delete
命令以及关联的mongo
Shell 方法db.collection.deleteOne()
和db.collection.deleteMany()
。findAndModify
命令和关联的mongo
Shell 方法:
请参阅:
JavaScript 执行于 mongos
从 MongoDB 4开始。 4 ,MongoDB 允许在mongos
实例上执行 JavaScript。要在mongos
实例上禁用 JavaScript 执行:
将
security.javascriptEnabled
配置选项设置为 false,或者指定
--noscripting
命令行选项。
早期版本的 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
字段。此字段只应用于诊断目的。
currentOp
输出
$currentOp
在报告正在进行的验证操作时包括dataThroughputAverage
和dataThroughputLastSecond
信息。currentOp
命令在报告正在进行的验证操作时会包含dataThroughputAverage
和dataThroughputLastSecond
信息。
新的 KMIP 连接参数 mongod
MongoDB 4 。 4 Enterprise 引入了两个新的配置设置,以增强与 KMIP 服务器的初始连接,作为 Kerberos 身份验证的一部分:
连接重试
要控制mongod
重试与 KMIP 服务器初始连接失败的次数:
设置
security.kmip.connectRetries
配置选项,或者指定
mongod --kmipConnectRetries
命令行选项。
连接超时
要控制放弃或重试之前等待 KMIP 服务器初始响应的超时时间(以毫秒为单位):
设置
security.kmip.connectTimeoutMS
配置选项,或者指定
mongod --kmipConnectTimeoutMS
命令行选项。
这些设置仅在 MongoDB Enterprise 中可用。
新的初创企业选项 mongod
的新processUmask
mongod
启动选项允许您通过 umask 设置权限 适用于群组和其他用户(当honorSystemUmask
设置为false
时)。
mapReduce
忽略verbose
选项
从 MongoDB 4开始。 4 、 mapReduce
命令和db.collection.mapReduce()
shell 方法会忽略verbose选项。
explain
支持 mapReduce
从 MongoDB 4开始。 4 ,可以使用explain
命令或db.collection.explain()
shell 方法预览mapReduce
或db.collection.mapReduce()
的结果。
对explain
结果的改进
从版本 4.4 开始:
在分片集群上运行的命令的 解释结果 包括 的顶级 serverInfo
mongos
serverInfo
对象以及为每个分片返回的 对象。这在版本 4.2.2、4.0.14 和 3.6.16 中也可用。当
optimizedPipeline
为 时, 解释结果 包括 serverInfotrue
对象。在 MongoDB 的早期版本中,当optimizedPipeline
为true
时,explain
结果有时不包含serverInfo
对象。 这在版本 4.2.2、4.0.14 和 3.6.16 中也可用。nReturned
executionTimeMillisEstimate
当您在db.collection.explain().aggregate()
executionStats
和 模式下运行allPlansExecution
方法时,聚合的 解释结果 包括每个 管道阶段 的 和 字段。
提示
另请参阅:
comment
可用于所有数据库命令的选项
从 MongoDB 4开始。 4 ,所有数据库命令都支持按以下方式指定comment
字段:
例子
db.runCommand( { <command> , "comment" : <any BSON type> })
设置后,注释将与命令记录一起出现在以下位置:
mongod 日志消息,位于
attr.command.cursor.comment
字段中。command.comment
字段中的数据库分析器输出。currentOp
输出,在command.comment
字段。
评论必须是有效的BSON 对象(字符串、整数、数组等)。
对位置$
操作符的改进
从 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 442降级。将 系列转换为 。 - 系列部署。但是,进一步降级该 。部署到 的 系列。不支持4 240系列部署。
立即下载
要下载 MongoDB 4 。 4 ,转到MongoDB 下载中心。
提示
另请参阅:
已知问题
版本中 | 问题 | 状态 |
---|---|---|
4.4.0 | SERVER-45042 :社区版和企业版的 MongoDB 服务器安装 MSI 不再包含 MongoDB 数据库工具 的二进制文件。有关更多信息,请参阅 工具更改。 | 未解决 |
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 票证的说明。