您当前的位置:首页 > 电脑百科 > 数据库 > 百科

MongoDB 6.0 新特性概览

时间:2022-11-09 16:50:41  来源:今日头条  作者:阿里云数据库

速览

正如发布MongoDB 5.0时承诺的更快发布频率,年度大版本MongoDB 6.0也于2022年正式跟广大数据库爱好者们见面了。目前阿里云MongoDB已经完成了对6.0版本的适配工作,大家可以直接在官网控制台进行购买和尝鲜体验!

 

该版本的主要功能特性包括:

● 时序集合增强

● Change Stream增强

● 可查询加密

● 聚合&query能力增强

● 集群同步

总结来看,MongoDB 6.0的新功能旨在促进开发和运营,消除数据孤岛,并消除因不必要地使用额外第三方技术而带来的业务复杂性。

 

新特性

时序集合(time series collections)

作为从5.0发布时面向时序数据的全新功能,时序集合标志着MongoDB这一OLTP型数据库希望能处理好更多AP型场景的决心,官方对时序集合的支持也一直保持着高速的更新&改进频率。比如为了支持更好分布数据而在5.1引入的分片(sharding)、为了改善存储空间占用而在5.2引入的列式压缩(columnar compression)以及为了支持部分数据点缺失情况下的时序分析而在5.3引入的密集化和间隙填充(densification and gap-filling)

另外,时序集合的索引方面也有增强。从6.0开始,为了提高读取性能,时序集合现在包括测量的二级和复合索引。时序数据也开始和空间维度进一步结合形成时空数据,时序结合开始支持地理位置索引(geo-indexing)。通过将地理信息附加到时间序列数据,开发人员可以更好地分析涉及举例和位置的场景。比如跟踪夏日冷链运输车的温度变化情况以及监测特定航线上的货运船燃料消耗等。

性能方面也有一些优化,主要针对的是查询以及排序场景。比如MongoDB可以更快返回时序数据中的最后一个数据点("last point" query),而不再需要扫描整个集合以后才得到想要的数据;通过在时间以及元数据字段上的聚簇索引(clustered index)以及二级索引(secondary index)能够更高效地完成排序操作。

Change Stream

作为支持CDC的核心功能之一,Change Stream迎来了自MongoDB 3.6发布以来的一次重大更新。有了Change Stream,业务可以更容易地实时获取数据库的变更,并基于此构建各种事件驱动型的应用或系统,不再需要依赖其他的数据同步中间件。

 

看新特性之前让我们先看下之前版本里有关Change Stream功能的更新历史:

 

在这次的MongoDB 6.0版本里。对Change Stream的更新包括:

● 支持变更的前后视图(pre-image和post-image)

● 支持更多的DDL(包括
create/createIndexes/modify/shardCollection)

● 性能提升:聚合框架上pipeline中stage的下推以及优化

●change event新增了wallTime字段,时间戳也能支持多种转换和展示算子($toDate/$tsSeconds/tsIncrement)以方便业务消费

在之前,客户端只能通过change events获取文档变更后的状态,现在也能支持获取变更前的状态了。这使得一些同时需要变更前&变更后的下游系统(用作校对或审计)能够充分利用数据库原生的能力而无需自行在业务层面耦合。更灵活的功能形态将大大扩展changeStream未来的使用场景。与此同时,支持更多的DDL操作也使得Change Stream的应用场景限制变得更少,不再会遇到经常中断后需要resume的情况。之前的使用场景中,分片集群需要mongos做merge,导致mongos成为整个changeStream的瓶颈点,性能也不够理想;这次从框架层面的优化以及部分场景下的stage下推带来的性能提升值得期待。

总而言之,这次大版本的功能升级也是对用户广泛诉求(SERVER-36941以及SERVER-46414)的积极响应,表明了MongoDB对数据库使用者体验上的关注。

Queryable Encryption (Preview)

数据安全正在肉眼可见地变得越来越重要。已有的传输加密或者静态加密手段没办法实现在使用过程中的加密,这使得更复杂的加密和更方便的查询看起来是背道相驰的事情。MongoDB 6.0推出的可查询加密可以允许用户从客户端加密敏感数据,将其作为完全随机的加密数据存储在数据库服务器端,并对加密数据直接进行丰富的查询。

从下面的示例中可以看到只有客户端能看到敏感信息的明文,在query到达server时会同时包含从KMS获取的加密秘钥,然后在server端以密文进行查询并返回,最后在客户端用驱动利用密钥解密后以明文呈现。

 

其特点&优势包括:

● 从客户端加密敏感数据,只有客户端拥有加密密钥。

● 数据在整个生命周期(传输、存储、使用、审计或备份)中都是加密的。

● 客户端可以直接对加密数据进行丰富的查询(等值匹配、范围、前后缀、子字符串等查询类型)。

● 强大的数据隐私保护能力,只有能访问客户端应用程序和加密密钥的授权用户才能看到明文数据。

● 更轻量化的应用程序开发,涉及敏感数据的开发者无需考虑太多安全、合规的事情,数据库直接提供综合加密解决方案。

● 降低敏感数据上云的安全顾虑。

值得一提的是,可查询加密功能依然是预览(Preview)版本,不建议直接在生产环境使用。社区版不支持客户端字段级加密(Client-Slide Field Level Encryption)的自动加密,可以使用显示加密(需要使用驱动的加密库lib)。

聚合功能

MongoDB的聚合功能允许用户处理多个文档并返回计算结果。通过将多个操作符组合到聚合管道中,用户可以构建出足够复杂的数据处理管道以提取数据并进行分析。MongoDB 6.0持续在聚合功能上深耕,带来了一些新的功能以及优化,包括:

● 改进了$lookup对JOINS的支持;

● 改进了$graphlookup 对图遍历的支持;

● $lookup和$graphlookup 支持分片集群;

● $lookup性能提升(部分场景可达百倍)。

Query

新增了一些查询操作符的支持。比如$maxN、$topN、$minN、$bottomN、$lastN、$sortArrary等。主要目的是利用操作符算子将更多的计算从业务中下沉到数据库中,使得业务层更加轻量化。这些$xxxN可以看做对原本$min/$max/$last操作符的补充,用户可以视实际业务场景中需要返回一个或者多个结果来使用不同的操作符。

以$maxN为例,其既可以被使用在数组中,也可以集成进聚合语句的管道中。

# 用作arrary中
db.scores.insertMany([
  { "playerId" : 1, "score" : [ 1, 2, 3 ] },
  { "playerId" : 2, "score" : [ 12, 90, 7, 89, 8 ] },
  { "playerId" : 3, "score" : [ null ] },
  { "playerId" : 4, "score" : [ ] }
  { "playerId" : 5, "score" : [ 1293, "2", 3489, 9 ]}
])
# 给每个文档增加新的字段,保留最大的2个分数
db.scores.aggregate([
   { $addFields: { maxScores: { $maxN: { n: 2, input: "$score" } } } }
])

# 用在聚合pipeline中
db.gamescores.insertMany([
   { playerId: "PlayerA", gameId: "G1", score: 31 },
   { playerId: "PlayerB", gameId: "G1", score: 33 },
   { playerId: "PlayerC", gameId: "G1", score: 99 },
   { playerId: "PlayerD", gameId: "G1", score: 1 },
   { playerId: "PlayerA", gameId: "G2", score: 10 },
   { playerId: "PlayerB", gameId: "G2", score: 14 },
   { playerId: "PlayerC", gameId: "G2", score: 66 },
   { playerId: "PlayerD", gameId: "G2", score: 80 }
])
# 找到单个游戏的3个高分
db.gamescores.aggregate( [
   {$match : { gameId : "G1" }},
   {
      $group:
         {
            _id: "$gameId",
            maxThreeScores:
               {$maxN:{input: ["$score","$playerId"],n:3}}
         }
   }
] )

$maxN和$topN看起来有些重复,实则各有不同的使用场景。topN会返回排序后的结果,而maxN则并不依赖特定的排序规则。

$sortArrary则强化了数组内是若干子对象场景下的排序,用户可以指定任意一个子文档内的字段、嵌套字段或者复合字段来按需进行数组的排序。该操作符可以有效简化部分带数组排序的复合聚合查询。

db.engineers.insertOne(
   {"team":
         [
           {"name": "pat","age": 30,"address": { "street": "12 Baker St", "city": "London" }},
           {"name": "dallas","age": 36,"address": { "street": "12 Cowper St", "city": "Palo Alto" }},
           {"name": "charlie","age": 42,"address": { "street": "12 French St", "city": "New Brunswick" }}
         ]
   }
)

# 多种查询方式
db.engineers.aggregate( [
  { $project:{_id: 0,result:{$sortArray: { input: "$team", sortBy: { name: 1 } }}}}
] )
db.engineers.aggregate( [
  { $project:{_id: 0,result:{$sortArray: { input: "$team", sortBy: { age: -1, name: 1 } }}}}
] )
db.engineers.aggregate( [
  { $project:{_id: 0,result:{$sortArray: { input: "$team", sortBy: { "address.city": -1 }}}}
] )

更多细节请查阅相关查询操作符的官方文档。

弹性

初始化同步(initial sync)用于节点刚加入副本集时的数据同步阶段。这一阶段因性能差一直被诟病。在6.0官方通过支持基于文件拷贝的初始化同步模式,将同步的性能提升了4倍左右。不过目前仅企业版支持此功能。

水平伸缩方面,MongoDB 6.0在分片上做出了重大改进。将原本默认是64MB的chunk size调整成为了128MB,更大的数据块,意味着更少的数据迁移频率以及更低的网络及路由层开销。做出这样的调整应该也是观察到了广泛客户在分片集群上部署海量数据时遭遇到的chunk数量瓶颈及性能问题。为了避免一个全局参数过于武断,MongoDB 6.0也支持了
configureCollectionBalancing命令,可以为不同的分片表设置不同的chunk size。比如数据规模特别大的分片表,将chunk size调整到256MB;数据规模相对较小但希望在shard上分布更均匀的表,将chunk size调整到64或32MB。

与此同时,该命令还允许对集合进行主动的碎片整理。相较于compact命令提供了更好的碎片整理服务,有效减少磁盘空间占用。

db.adminCommand(
   {
     configureCollectionBalancing: "<collection>",
     chunkSize: <num>,
     defragmentCollection: <bool>
   }
)

安全性增强

下面的图里展示了整个MongoDB产品的安全功能矩阵。除了前面提到的全新特性:queryable enryption,本次发布的MongoDB 6.0也带来了其他安全性增强。

 

客户端字段级加密(CSFLE, client-side field-level encryption)自19年发布以来就被广泛应用于敏感数据的管理中,尤其是在将数据迁移到公有云的场景下。MongoDB6.0的CSFLE将支持任何符合KMIP(Key Management Interoperability Protocol)的密钥管理提供商。作为领先的行业标准,KMIP优化了加密对象(如加密密钥、证书等)的存储、操作和处理,使得整个流程更加规范化。这也标志着,除了基于keyfile的本地秘钥管理外,mongoDB也支持通过KMIP将自己与第三方秘钥管理设备集成,为用户提供更安全的保障。

此外,MongoDB 6.0允许对审计日志加密。审计日志中也可能包含了重要信息,可以被压缩和加密后写入磁盘,并且在审计日志的传播过程中依然保持加密。

此加密功能仅适用于使用WT引擎的企业版本,当然Atlas也是默认开启加密的。

集群同步(Cluster-to-Cluster Sync)

无论是数据的同构同步(mongo-to-mongo)还是异构同步(others-to-mongo& mongo-to-others)都是mongoDB生态中的一部分,官方在
mongoimport/mongoexport/mongodump/mongorestore的工具矩阵中一直没有很好得规划关于『数据同步』这一部分的生态位,因此MongoDB的数据同步也呈现出了百花齐放的形态,包括早期的connector、MongoShake、云服务提供商的DTS服务以及部分创业公司的商业化产品。

伴随着MongoDB 6.0的发布,官方的同步工具mongosync也终于面世。它能提供跨任何环境的两个 MongoDB 集群的连续、单向数据同步,无论是混合环境、Atlas、本地还是边缘环境。用户还可以实时控制和监控整个同步过程,按需启动、停止、恢复甚至反转同步。

 


 

集群内的数据同步由副本集和sharding完成,Cluster-to-Cluster Sync希望能解决集群间的同步问题,主要覆盖以下场景:

● 自建到云服务的迁移或者反过来

● 创建单独的私有化数据库

● 支持Devops策略(比如blue-green部署)

● 构建专用的分析环境

● 满足审计和合规性的本地化要求

● 中心向边缘的同步

使用方式也与其他数据同步工具并无差异:1)准备好源和目标集群;2)部署mongosync;3)按需启动同步;4)全量同步完成后,增量数据也会同步;5)利用common endpoint来终止同步关系。

遗憾的是,Cluster-to-Cluster Sync仅与在MongoDB6.0以上版本运行的源和目标集群兼容。这也意味着广泛使用的其他低版本仍然要依赖之前的第三方同步工具来完成上面提到的数据迁移/同步场景。

因篇幅原因就不在这里列出。更多MongoDB 6.0版本变动细节请参考release-notes。(
https://www.mongodb.com/docs/v6.0/release-notes/6.0/) 云数据库MongoDB版_兼容MongoDB托管数据库_文档型数据库_数据库-阿里云



Tags:MongoDB   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
MongoDB 大量数据插入时的性能影响及解决方法
MongoDB 是一种广泛应用的 NoSQL 数据库,以其高度可扩展性和灵活性而闻名。然而,在处理大量数据时,MongoDB 的性能可能会受到一些影响。大量数据插入对 MongoDB 性能的影响磁盘...【详细内容】
2024-01-05  Search: MongoDB  点击:(130)  评论:(0)  加入收藏
MongoDB NoSQL之美:为什么选择非关系型数据库?
非关系型数据库(NoSQL)在过去几年中变得越来越受欢迎。传统的关系型数据库(RDBMS)在许多应用场景下存在一些限制,而非关系型数据库提供了一种新的数据存储和查询方式,具有许多优点...【详细内容】
2023-09-05  Search: MongoDB  点击:(266)  评论:(0)  加入收藏
MongoDB 6.0 新特性概览
速览正如发布MongoDB 5.0时承诺的更快发布频率,年度大版本MongoDB 6.0也于2022年正式跟广大数据库爱好者们见面了。目前阿里云MongoDB已经完成了对6.0版本的适配工作,大家可以...【详细内容】
2022-11-09  Search: MongoDB  点击:(555)  评论:(0)  加入收藏
MongoDB 安装使用
MongoDB 简介MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。它的最大特点是:&bull;特别适合存储大量的无结...【详细内容】
2021-06-25  Search: MongoDB  点击:(421)  评论:(0)  加入收藏
MongoDB 最常见的 10 个错误说法
我加入 MongoDB 还不到一年,但学到了很多东西。在面试这家公司前,我从未真正使用过 MongoDB,尽管我听过一些有关它的演讲,并且它的简单易用给我留下深刻印象。...【详细内容】
2021-01-26  Search: MongoDB  点击:(460)  评论:(0)  加入收藏
MongoDB 存储引擎 MongoRocks
MongoRocks 是基于著名的开源KV数据库RocksDB实现的一个MongoDB存储引擎,借助rocksdb的优秀特性,MongoRocks能很好的支持一些高并发随机写入、读取的应用场景。 MongoDB 与 Mo...【详细内容】
2020-08-21  Search: MongoDB  点击:(441)  评论:(0)  加入收藏
 mongodb 这三个大坑踩过吗?
背景讲故事前段时间有位朋友在微信群问,在向 mongodb 中插入的时间为啥取出来的时候少了 8 个小时,8 在时间处理上是一个非常敏感的数字,又吉利又是一个普适的话题,后来我想想初...【详细内容】
2020-08-19  Search: MongoDB  点击:(311)  评论:(0)  加入收藏
提升 MongoDB 安全性的 10 个方法
MongoDB提供了一系列组件来提升数据的安全性。数据安全在MongoDB中是最重要的&mdash;&mdash;因此它利用这些组件来减少曝光面。下面是10个可以用来改善你个人或云中MongoDB...【详细内容】
2020-02-16  Search: MongoDB  点击:(342)  评论:(0)  加入收藏
MongoDB 是什么 ? 能干嘛?
总结的目的在于回顾MongoDB的相关知识点,明确MongoDB在企业级应用中充当的角色,为之后的技术选型提供一个可查阅的信息简报。...【详细内容】
2019-10-28  Search: MongoDB  点击:(651)  评论:(0)  加入收藏
公司如何选择数据库?DynamoDB、Hadoop和MongoDB 大比拼
用户如何选择最能满足当前业务需求的数据库,通常取决于其开发团队的技术和已使用的应用程序。了解哪种数据库系统最适合用户公司的当前和未来需求十分重要。数据库在所有行业和组织机构中都扮演着至关重要的角色。因此...【详细内容】
2019-10-23  Search: MongoDB  点击:(601)  评论:(0)  加入收藏
▌简易百科推荐
向量数据库落地实践
本文基于京东内部向量数据库vearch进行实践。Vearch 是对大规模深度学习向量进行高性能相似搜索的弹性分布式系统。详见: https://github.com/vearch/zh_docs/blob/v3.3.X/do...【详细内容】
2024-04-03  京东云开发者    Tags:向量数据库   点击:(5)  评论:(0)  加入收藏
原来 SQL 函数是可以内联的!
介绍在某些情况下,SQL 函数(即指定LANGUAGE SQL)会将其函数体内联到调用它的查询中,而不是直接调用。这可以带来显著的性能提升,因为函数体可以暴露给调用查询的规划器,从而规划器...【详细内容】
2024-04-03  红石PG  微信公众号  Tags:SQL 函数   点击:(5)  评论:(0)  加入收藏
如何正确选择NoSQL数据库
译者 | 陈峻审校 | 重楼Allied Market Research最近发布的一份报告指出,业界对于NoSQL数据库的需求正在持续上升。2022年,全球NoSQL市场的销售额已达73亿美元,预计到2032年将达...【详细内容】
2024-03-28    51CTO  Tags:NoSQL   点击:(14)  评论:(0)  加入收藏
为什么数据库连接池不采用 IO 多路复用?
这是一个非常好的问题。IO多路复用被视为是非常好的性能助力器。但是一般我们在使用DB时,还是经常性采用c3p0,tomcat connection pool等技术来与DB连接,哪怕整个程序已经变成以...【详细内容】
2024-03-27  dbaplus社群    Tags:数据库连接池   点击:(14)  评论:(0)  加入收藏
八个常见的数据可视化错误以及如何避免它们
在当今以数据驱动为主导的世界里,清晰且具有洞察力的数据可视化至关重要。然而,在创建数据可视化时很容易犯错误,这可能导致对数据的错误解读。本文将探讨一些常见的糟糕数据可...【详细内容】
2024-03-26  DeepHub IMBA  微信公众号  Tags:数据可视化   点击:(7)  评论:(0)  加入收藏
到底有没有必要分库分表,如何考量的
关于是否需要进行分库分表,可以根据以下考量因素来决定: 数据量和负载:如果数据量巨大且负载压力较大,单一库单一表可能无法满足性能需求,考虑分库分表。 数据增长:预估数据增长...【详细内容】
2024-03-20  码上遇见你  微信公众号  Tags:分库分表   点击:(16)  评论:(0)  加入收藏
在 SQL 中写了 in 和 not in,技术总监说要炒了我……
WHY?IN 和 NOT IN 是比较常用的关键字,为什么要尽量避免呢?1、效率低项目中遇到这么个情况:t1表 和 t2表 都是150w条数据,600M的样子,都不算大。但是这样一句查询 &darr;select *...【详细内容】
2024-03-18  dbaplus社群    Tags:SQL   点击:(6)  评论:(0)  加入收藏
应对慢SQL的致胜法宝:7大实例剖析+优化原则
大促备战,最大的隐患项之一就是慢SQL,对于服务平稳运行带来的破坏性最大,也是日常工作中经常带来整个应用抖动的最大隐患,在日常开发中如何避免出现慢SQL,出现了慢SQL应该按照什...【详细内容】
2024-03-14  京东云开发者    Tags:慢SQL   点击:(5)  评论:(0)  加入收藏
过去一年,我看到了数据库领域的十大发展趋势
作者 | 朱洁策划 | 李冬梅过去一年,行业信心跌至冰点2022 年中,红衫的一篇《适应与忍耐》的报告,对公司经营提出了预警,让各个公司保持现金流,重整团队,想办法增加盈利。这篇报告...【详细内容】
2024-03-12    InfoQ  Tags:数据库   点击:(32)  评论:(0)  加入收藏
SQL优化的七个方法,你会哪个?
一、插入数据优化 普通插入:在平时我们执行insert语句的时候,可能都是一条一条数据插入进去的,就像下面这样。INSERT INTO `department` VALUES(1, &#39;研发部(RD)&#39;, &#39...【详细内容】
2024-03-07  程序员恰恰  微信公众号  Tags:SQL优化   点击:(20)  评论:(0)  加入收藏
站内最新
站内热门
站内头条