目录
1、使用MongoDB8.0的4大理由
2、兼容性更改
3、查询行为变化
4、弃用功能
5、其他废弃项
6、向后不兼容功能
7、一般性变更
使用 MongoDB 8.0 的 4 大理由
1. MongoDB 8.0 比以前快 30% 以上
MongoDB 8.0 允许应用程序快速高效地查询和转换数据,从而显著提高性能,吞吐量提高了 36%。MongoDB 8.0 中的架构优化减少了内存使用量和查询时间,并且更高效的批处理和优化相结合,使数据复制期间的更新吞吐量提高了 59%,并发写入速度提高了 20%。此外,MongoDB 8.0 中的优化意味着数据库可以处理更大量的时间序列数据,并将操作速度提高 200% 以上,同时降低资源使用和成本。
2. MongoDB 8.0 比以往任何时候都更安全
MongoDB 可查询加密是由 MongoDB 加密研究小组开发的行业首创创新。它允许客户在客户端加密敏感数据,将其作为完全随机的加密数据安全地存储在 MongoDB 数据库中,并对加密数据运行富有表现力的查询以进行处理。
除了相等查询之外,MongoDB 8.0 现在还支持范围查询,以扩展安全数据检索,为常见搜索提供更大的灵活性。使用可查询加密,所需数据将保持加密状态,直到使用客户控制的解密密钥到达授权最终用户,无需加密专业知识。
3. MongoDB 8.0 使其更便宜、更易于扩展
使用 MongoDB 8.0,水平扩展现在更快、更容易,并且成本更低。通过水平扩展,应用程序可以通过将数据拆分到多个服务器(称为分片)来扩展,从而超越传统数据库资源的限制,而无需为单个服务器预先预置越来越多的计算资源。MongoDB 8.0 中新的分片功能使跨分片分发数据的速度提高了 50 倍,并且入门成本降低了 50%。
4. MongoDB 8.0 为您提供更多控制权,帮助您的应用程序平稳运行
MongoDB 8.0 为团队提供了更好的控制,优化数据库性能,以应对不可预测的使用高峰和持续的高需求时期。MongoDB 8.0 包含新功能,可为运行查询设置默认最大时间限制,拒绝重复出现的问题查询类型,以及设置查询设置以在数据库重启等事件中持续存在。这些功能有助于提供一致的应用程序行为和高性能,而不受需求高峰或意外事件的影响。
MongoDB 8.0中的兼容性更改
查询行为变化
null 和 undefined 比较:从 MongoDB 8.0 开始,在等值匹配表达式中将 null 与字段值进行比较时,不再匹配 undefined 值。
{ _id: 1, name: null },
{ _id: 2, name: undefined },
{ _id: 3, name2: "Alice" }
db.people.find({ name: null })
db.people.find({ name: undefined })
从 MongoDB 8.0开始,前面的查询与name字段为undefined ( _id: 2 ) 的文档不匹配。要匹配name为undefined的文档,您必须在查询中显式指定undefined类型。示例,以下查询会返回所有示例文档:db.people.find( {
$or: [
{ name: null },
{ name: { $type: "undefined" } }
]
} )
影响的操作:此变化同样影响 $eq、$in 以及 $lookup 操作,因为本地字段为 null 时不再能与外键字段的 undefined 值匹配。
废弃功能
LDAP 认证和授权:从 MongoDB 8.0 开始,LDAP 身份验证和授权功能被废弃,虽然在整个 MongoDB 8.0 生命周期内仍可使用,但将在未来的主版本中移除。
Hedged Reads:从 MongoDB 8.0 开始,Hedged Reads 被废弃,指定读取偏好最近的查询不再默认使用 Hedged Reads,如果显式指定,则 MongoDB 会执行 Hedged Read 并记录警告。
索引过滤器:从 MongoDB 8.0 开始,推荐使用查询设置代替添加索引过滤器,因为索引过滤器不具备持久性和易于在所有集群节点上创建的特点。
## find 命令添加查询设置,指定查询使用索引
db.adminCommand( {
setQuerySettings: {
find: "pizzaOrders",
filter: {
orderDate: { $gt: ISODate( "2023-01-20T00:00:00Z" ) }
},
sort: {
totalNumber: 1
},
$db: "test"
},
settings: {
indexHints: {
ns: { db: "test", coll: "pizzaOrders" },
allowedIndexes: [ "orderDate_1" ]
},
queryFramework: "classic"
}
} )
##获取查询设置
db.aggregate( [
{ $querySettings: {} }
] )
服务器端 JavaScript 函数:从 MongoDB 8.0 开始,服务器端 JavaScript 函数(如 $accumulator、$function、$where)被废弃,运行这些函数时 MongoDB 会记录警告。
其他废弃项:
还包括 tcmallocAggressiveMemoryDecommit 参数、enableFinerGrainedCatalogCacheRefresh 参数、不推荐使用timeField作为时间序列集合中的分分片键、
MongoDB 8.0弃用了cleanupOrphaned命令。要确认没有剩余孤立文档,请改用$shardedDataDistribution 。
db.aggregate( [
{ $shardedDataDistribution: { } }
] )
输出字段
$shardedDataDistribution阶段输出数据库中每个分分片的集合的文档大量。这些文档包含以下字段:
字段名称 | 数据类型 | 说明 |
ns | 字符串 | 分片集合的命名空间。 |
shards | 阵列 | 集合中的分片以及每个分片的数据分布信息。 |
shards.numOrphanedDocs | 整型 | 分片中的孤立文档的数量。 |
shards.numOwnedDocuments | 整型 | 分片拥有的文档数。 |
shards.ownedSizeBytes | 整型 | 分片拥有的文档的存储量(以字节为单位)。 |
shards.orphanedSizeBytes | 整型 | 分片中孤立文档的存储量(以字节为单位)。 |
从 MongoDB8.0 $shardedDataDistribution开始,仅当主分片包含数据段或 孤立文档 时, 才会返回集合 主 分片的输出。
向后不兼容的功能
直接连接分片并运行命令:从 MongoDB 8.0 开始,只能对分片运行特定命令(某些命令)。尝试直接连接到分片并运行不受支持的命令时,MongoDB 将返回错误。
写关注多数:从 MongoDB 8.0 开始,使用 "majority" 写关注的写操作会在大多数副本集成员写入 oplog 条目后返回确认,提高了 "majority" 写操作的性能。在以前的版本中,这些操作将等待,并在大多数副本集成员应用更改后返回确认。
Oplog 缓冲区:从 MongoDB 8.0 开始,次级节点以批处理方式并行写入和应用 oplog 条目,这引入了对 metrics.repl.buffer 状态指标的破坏性变化,并用新的指标取代了一些旧的服务器状态指标。
MongoDB 8.0弃用了以下服务器状态指标:metrics.repl.buffer.count
metrics.repl.buffer.maxSizeBytes
metrics.repl.buffer.sizeBytes
它将它们替换为以下指标:metrics.repl.buffer.apply.count
metrics.repl.buffer.apply.maxSizeBytes
metrics.repl.buffer.apply.sizeBytes
metrics.repl.buffer.write.count
metrics.repl.buffer.write.maxSizeBytes
metrics.repl.buffer.write.sizeBytes
一般性变更
关闭性能:从 MongoDB 8.0 开始,Bulk.insert() 和数据摄入工作负载可能表现更好,但在这些工作负载之后立即关闭 MongoDB 可能需要更长时间,因为需要额外的数据刷新到磁盘。
var bulk = db.items.initializeUnorderedBulkOp();
bulk.insert( { item: "abc123", defaultQty: 100, status: "A", points: 100 } );
bulk.insert( { item: "ijk123", defaultQty: 200, status: "A", points: 200 } );
bulk.insert( { item: "mop123", defaultQty: 0, status: "P", points: 0 } );
bulk.execute();
并发压缩命令不允许:从 MongoDB 8.0 开始,不允许同时在同一集合上运行多个并发compact的压缩命令。
地理空间输入验证:从 MongoDB 8.0 开始,不允许使用格式错误的输入执行地理空间查询。
OIDC 身份提供者可以共享发行者:从 MongoDB 8.0 开始,当定义了多个身份提供者时,oidcIdentityProviders参数接受重复的发行者值,前提是每个发行者的受众值是唯一的。
serverStatus 输出更改:从 MongoDB 8.0 开始,wiredTiger.concurrentTransactions 被重命名为 queues.execution 。
聚合变化:当计算排名时,null 与 $denseRank 和 $ranksortBy 操作中的缺失字段值将被同等对待。这一更改将使 $denseRank 和 $ranksortBy的行为与 $sort 一致。
升级的 TCMalloc:从 MongoDB 8.0 开始,MongoDB 使用了升级版的 TCMalloc,该版本使用每 CPU 缓存而不是每线程缓存,以减少内存碎片并提高数据库在高压力工作负载下的弹性。
以上是 MongoDB 8.0 版本的主要变更点,涵盖了查询行为、废弃功能、向后不兼容的特性以及一些通用的改进。这些变更旨在提升系统的性能、安全性和易用性。
公众号内直接回复加群也可以,扫码加群也可以,觉得帖子写的不错,点点关注,点点赞,多多转载,请多多支持
往期帖子汇总:
数据库维护工具:数据迁移、性能监控、数据修复的全面工具汇总
PostgreSQL:从零开始学PostgreSQL