MongoDB 8.0中的兼容性更改
查询行为
null 查询不匹配未定义的字段
从MongoDB 8.0开始,等值等值匹配表达式中与 null
的比较与undefined
值不匹配。
示例,考虑以下文档和查询:
// people collection [ { _id: 1, name: null }, { _id: 2, name: undefined }, { _id: 3, name: [ "Gabriel", undefined ], { _id: 4, names: [ "Alice", "Charu" ] } ]
db.people.find( { name: null } )
在 MongoDB 8.0之前,前面的查询将匹配符合以下条件的文档:
name
字段为null
(_id: 1
)name
字段为undefined
或包含undefined
大量元素(_id: 2
和_id: 3
)name
字段不存在 (_id: 4
)
从MongoDB 8.0 开始,前面的查询不匹配 name
字段为 undefined
或包含 undefined
大量元素的文档。该查询仅匹配符合以下条件的文档:
name
字段为null
或包含null
大量元素 (_id: 1
)name
字段不存在 (_id: 4
)
此查询行为更改还会影响以下操作:
弃用
已弃用 | 说明 |
---|---|
LDAP | 从MongoDB 8.0开始, LDAP身份验证和授权已弃用。 LDAP可用并将在MongoDB 8的整个生命周期内继续运行而不进行更改。 LDAP将在未来的主要发布中删除。 有关更多详细信息,请参阅LDAP弃用。 LDAP迁移信息将在将来提供。 |
对冲读 (Hedged Reads) | 从 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 。 |
rangePreview | 从MongoDB 8.0 开始, 如果您的Queryable Encryption集合使用 |
向后不兼容的功能
无法直接连接到分片并运行命令
从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"
写关注(write concern)的写入操作会返回确认。 这提高了"majority"
写入的性能。 在以前的版本中,这些操作将等待,并在大多数副本集成员应用更改后返回确认。
oplog缓冲区
从MongoDB 8.0开始,从节点并行为每个批处理写入和应用oplog条目。 这对metrics.repl.buffer
状态指标进行了破坏性变更 (breaking change),因为它现在提供有关两个缓冲区(而不是一个)的信息。
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 性能优化。