为什么选择 MongoDB 8.0?四个不可抗拒的理由

cb499679f1a7f13b01ed3f3c4cf5efa5.png

目录

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 版本的主要变更点,涵盖了查询行为、废弃功能、向后不兼容的特性以及一些通用的改进。这些变更旨在提升系统的性能、安全性和易用性。

615279359e3070a27d3865a85a4fb283.jpeg

公众号内直接回复加群也可以,扫码加群也可以,觉得帖子写的不错,点点关注,点点赞,多多转载,请多多支持

往期帖子汇总:

数据库维护工具:数据迁移、性能监控、数据修复的全面工具汇总

PostgreSQL:从零开始学PostgreSQL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值