MongoDB 8.0中的兼容性更改
查询行为
null 查询不匹配未定义的字段
从MongoDB 8.0开始,等值等值匹配表达式中与 null
的比较与undefined
值不匹配。
例如,考虑以下文档和查询:
// people collection { _id: 1, name: null }, { _id: 2, name: undefined }, { _id: 3, name2: "Alice" }
db.people.find( { name: null } )
在 MongoDB 8.0之前,前面的查询将匹配符合以下条件的文档:
name
字段为null
(_id: 1
)name
字段为undefined
(_id: 2
)name
字段不存在 (_id: 3
)
从 MongoDB 8.0开始,前面的查询与name
字段为undefined
( _id: 2
) 的文档不匹配。
要匹配name
为undefined
的文档,您必须在查询中显式指定undefined
类型。例如,以下查询会返回所有样本文档:
db.people.find( { $or: [ { name: null }, { name: { $type: "undefined" } } ] } )
此查询行为更改还会影响以下操作:
弃用
已弃用 | 说明 |
---|---|
LDAP | 从MongoDB 8.0开始, LDAP身份验证和授权已弃用。 LDAP可用并将在MongoDB 8的整个生命周期内继续运行而不进行更改。 LDAP将在未来的主要发布中删除。 有关更多详细信息,请参阅LDAP弃用。 LDAP迁移信息将在将来提供。 |
对冲读 | 从 MongoDB 8.0开始,对冲读已弃用。 默认情况下,指定读取偏好 |
索引筛选器 | 已在版本8中弃用。 0 。 从 MongoDB 8.0开始,使用查询设置而不是添加索引筛选器。 从 MongoDB 8.0开始,索引筛选器已弃用。 查询设置的功能比索引筛选器更多。此外,索引筛选器不是持久性的,您无法轻松地为所有集群节点创建索引筛选器。要添加查询设置并探索示例,请参阅 |
服务器端 JavaScript 函数 | 从 MongoDB 8开始。 0和服务器端 JavaScript 函数( |
tcmallocAggressiveMemoryDecommit | MongoDB 8.0不建议使用 tcmallocAggressiveMemoryDecommit 参数。 |
enableFinerGrainedCatalogCacheRefresh | MongoDB 8.0不建议使用 enableFinerGrainedCatalogCacheRefresh 参数。 |
timeField 在时间序列集合的分分片键中 | 从MongoDB 8.0开始,不推荐使用 |
cleanupOrphaned | MongoDB 8.0弃用了 cleanupOrphaned 命令。 要确认没有剩余孤立文档,请改用$shardedDataDistribution 。 |
向后不兼容的功能
无法直接连接到分片并运行命令
从 MongoDB 8.0开始,您只能在分片上运行某些命令。如果您尝试直接连接到分片并运行不受支持的命令,MongoDB 将返回错误:
"You are connecting to a sharded cluster improperly by connecting directly to a shard. Please connect to the cluster via a router (mongos)."
要直接对分片运行不支持的数据库命令,您必须连接到mongos
或具有仅维护的directShardOperations
角色。
MongoDB 允许直接对分片运行命令,从而支持从副本集在线过渡到1分片集群。但是,一旦集群具有多个分片,则在没有仅维护directShardOperations
角色的情况下,只能直接对分片运行列出的命令。
写关注 Majority
从 MongoDB 8.0开始,当大多数副本集成员已写入更改的 oplog 条目时,使用"majority"
写关注的写入操作会返回确认。这提高了"majority"
写入的性能。在以前的版本中,这些操作将等待,并在大多数副本集成员应用更改后返回确认。
Oplog 缓冲区
从 MongoDB 8.0开始,从节点并行为每个批处理写入和应用 oplog 条目。这对metrics.repl.buffer
状态指标进行了重大更改,因为它现在提供有关两个缓冲区(而不是一个)的信息。
MongoDB 8.0弃用了以下服务器状态指标:
它将它们替换为以下指标:
一般性变更
关闭性能
从 MongoDB 8.0 开始,Bulk.insert()
和数据提取工作负载可能表现得更好。不过,在运行这些工作负载之后立即关闭 MongoDB 可能需要更长的时间,因为在将额外的数据刷新到磁盘上。
不允许并发压缩命令
从 MongoDB 8.0开始,如果您尝试对同一集合运行多个并发compact
命令,MongoDB 会返回错误。
地理空间输入验证
从 MongoDB 8.0开始,不能将地理空间查询与格式错误的输入一起使用。 在以前的版本中,某些地理空间查询接受格式错误的输入而不会出现错误。
OIDC 身份提供程序可以共享一个发布者
从 MongoDB 8.0 开始,当定义了多个身份提供程序 (IDP) 时,只要 audience
值对于每个发布者都是唯一的,oidcIdentityProviders
参数就会接受重复的 issuer
值。在版本 7.3 和 7.0 中,也可以使用此功能。
serverStatus 输出变更
从MongoDB 8.0开始, wiredTiger.concurrentTransactions
重命名为queues.execution
。
聚合(Aggregation)
$rank
和$denseRank
行为
从 MongoDB 8.0 开始,当计算排名时,null
与 $denseRank
和 $rank
sortBy 操作中的缺失字段值将被同等对待。这一更改将使 denseRank
和 rank
的行为与 $sort
一致。
$shardedDataDistribution 输出
从 MongoDB8.0 $shardedDataDistribution
开始,仅当主分片包含数据段或 孤立文档 时, 才会返回集合 主 分片的输出。
有关详细信息,请参阅$shardedDataDistribution
。
升级版 TCMalloc
从 MongoDB 8.0 开始,MongoDB 使用升级版 TCMalloc,此版本使用每 CPU 缓存而不是每线程缓存,以减少内存碎片,并使数据库对高压工作负载更有弹性。
要使用性能更优的新 TCMalloc,请参阅针对自托管部署的 TCMalloc 性能优化。