MongoDB 4.2新特性解读

2019 年 7 月 03 日

MongoDB 4.2新特性解读

MongoDB World 2019 上发布新版本 MongoDB 4.2 Beta,包含多项数据库新特性,本文尝试从技术角度解读。



全文检索


MongoDB 4.2 之前,全文搜索(全文搜索)的能力是靠文本索引来支持的,在 MongoDB-4.2 里,MongoDB 直接与 Lucene 等引擎整合,在 Atlas 服务里提供全文建索的能力。



MongoDB FTS 原理


  • 用户可以在Atlas上,对集合开启全文索引,后台会开起Lucene索引引擎(索引引擎,查询引擎均可配置),对存量数据建立索引。

  • 对于开启全文建索的集合,新写入到MongoDB的数据,后台的服务会通过Change Stream的方式订阅,并更新到Lucene索引引擎里。

  • 索引的查询直接以MongoDB查询的方式提供,Mongod收到请求会把请求转发到Lucene引擎,收到建索结果后回复给客户端。


全文搜索示例


下面是一个全文搜索使用的简单示例,整个使用体验非常简单,除了需要在 Atlas 控制台上建索引,其他跟正常使用 MongoDB 毫无差别,随着这块能力的完善,能覆盖很多 Elastic Search 的场景。


第 1 步:准备数据


MongoDB Enterprise > db.fruit.find(){ "_id" : 1, "type" : "apple", "description" : "Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp." }{ "_id" : 2, "type" : "banana", "description" : "Bananas are usually sold in bunches of five or six." }
复制代码


第二步:Atlas 上创建 FTS 索引



Step3:使用 MongoDB 客户端做搜索,支持通配符,前缀等多种搜索能力


// 简单查询
db.fruit.aggregate([ { $searchBeta: { "term": { "query": "Smith", "path": "description" } } }]){ "_id" : 1, "type" : "apple", "description" : "Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp." }
// Wildcard 查询db.fruit.aggregate([ { $searchBeta: { "term": { "query": "s*l*", "path": "description", "wildcard": true } } }]){ "_id" : 1, "type" : "apple", "description" : "Apples come in several varieties, including Fuji, Granny Smith, and Honeycrisp." }{ "_id" : 2, "type" : "banana", "description" : "Bananas are usually sold in bunches of five or six." }
复制代码


分布式事务


MongoDB 4.0 支持副本集事务,极大的丰富了应用场景; 4.0 的事务存在最大修改 16MB,事务执行时间不能过长的限制,在 4.2 支持分布式事务的这些问题都解决了。分布式事务的支持也意味用户修改分片密钥的内容成为可能,因为修改分片的内容,可能会导致键键要迁移到其他碎片,而在 4.2 之前,无法保证这个迁移动作(目标上新写,源上删掉)的原子性,而借助分布式事务,这个问题也就迎刃而解。


4.2 支持的分布式事务是硬核技术,目前具备这个能力的开源数据库本身也不多,MongoDB 采用二阶段提交的方式(细节以后再分析),实现在多个 Shard 间发生的修改,要么同时发生,要么都不发生,保证事务的 ACID 特性。



在使用上,4.2 的分布式事务跟 4.0 副本集事务使用方式完全一样,用户无需关心后端数据如何分布。



高可用性


MongoDB 在保证数据库服务可用性方面持续努力,在 4.0 提供了可重试写功能,在新的 4.2 版本,MongoDB 增加了可重试读功能,对于一些临时的网络问题,用户无需自己实现重试逻辑,MongoDB 会自动重试处理,保证用户业务的连续性。


改进的查询语言


MongoDB 4.2 在查询语言的表达能力上进一步增强,更新,聚合,索引等方面都有巨大的提升,具体细节等 4.2 正式版文档发出可以详细了解。


更新能力增强


4.2 之前,更新操作基本上都是用确定的值更新某个字段,在新版本里,更新能根据文档现有的字段内容来生成新的更新内容,如下的实例,根据文档 pay,tax 字段,加起来生成一个总字段;这个在 4.2 之前,用户需要先读取文档内容,获取工资,税字段得到结果,然后调用更新设置新的字段。类似的特性还有很多,基本上 Aggregation 里能表达的更新操作,4.2 的更新命令都能支持。


db.orders.find(){ "_id" : 1, "pay" : 100, "tax" : 17 }
// 这个操作发布会PPT上有写,但实际连 4.2 测试并不能工作,等正式版出来再看看db.orders.update( {_id: 1}, { "$set": { "total": { "$sum": ["$pay", "$tax"] } }})
复制代码


分析能力增强


聚合方面,MongoDB 也做了大量的改进,来更好的支持业务分析场景;比如增加 out,把当次分析结果写到某个集合)。


Index 能力增强(通配符索引)


使用 MongoDB 时,经常会遇到一些场景,某个字段包含很多个属性,很多属性都可能需要用于查询,现在的解决方案时,针对每个属性,必须提前知道它的访问行为,建立必要的索引; MongoDB 4.2 引入通配符索引,可以针对一系列的字段自动建索引,满足丰富的查询需求。


如下面的例子所示,书籍的属性字段里包含很多熟悉,包括颜色,大小等信息,如果经常需要根据属性查找,可以针对属性字段建立通配符索引。


db.books.find(){ "_id" : ObjectId("5d0c5d931eefdf585ae9ca95"), "type" : "book", "title" : "The Red Book", "attributes" : { "color" : "red", "size" : "large", "inside" : { "bookmark" : 1, "postitnote" : 2 }, "outside" : { "dustcover" : "worn" } } }{ "_id" : ObjectId("5d0c5d9e1eefdf585ae9ca96"), "type" : "book", "title" : "The Blue Book", "attributes" : { "color" : "blue", "size" : "small", "inside" : { "map" : 1 }, "outside" : { "librarystamp" : "Local Library" } } }{ "_id" : ObjectId("5d0c5dac1eefdf585ae9ca97"), "type" : "book", "title" : "The Green Book", "attributes" : { "color" : "green", "size" : "small", "inside" : { "map" : 1, "bookmark" : 2 }, "outside" : { "librarystamp" : "Faraway Library", "dustcover" : "good" } } }
// 没有索引的时候,根据颜色属性查找,走全表扫描db.books.find({"attributes.color": "green"}).explain(){ "queryPlanner" : { "queryHash" : "528C4C03", "planCacheKey" : "528C4C03", "winningPlan" : { "stage" : "COLLSCAN",}
// 针对 attributes 字段所有的子字段建立 Wildcard 索引,针对 color、size 等的查询就都可以走索引db.books.createIndex({ "attributes.$**": 1 });
db.books.find({"attributes.color": "green"}).explain(){ "queryPlanner" : { "winningPlan" : { "stage" : "FETCH", "inputStage" : { "stage" : "IXSCAN",}db.books.find({"attributes.size": "small"}).explain(){ "queryPlanner" : { "winningPlan" : { "stage" : "FETCH", "inputStage" : { "stage" : "IXSCAN",}
复制代码


现场级加密


MongoDB 除了支持 SSL,TDE 等安全机制,在 4.2 引入“字段级加密”的支持,实现对用户 JSON 文档的价值进行自动加密。整个过程在驱动程序层完成,传输,存储到服务端的文档值都是密文,MongoDB 4.2 Drvier 支持丰富的加密策略,可以针对集合,字段维度开启加密,加密过程对开发者完全透明。



MongoDB 和 Kubernetes



Kubernetes 是工业级的容器编排管理平台,可以使用 Kubernetes 管理 MongoDB 集群的整个生命周期,但随随业务部署环境越来越复杂多样化,有的可能是私有云部署,有的可公有云的部署,使得集群的管理难度也越来越高。


在新版本 MongoDB Atlas(公有云),MongoDB Cloud Manager(私有云企业版管理)都集成了 Kubernetes 运营商的支持,使得用户可以使用 Kubernetes 统一管理 MongoDB 资源。


MongoDB 图表


MongoDB Chart 在去年的 MongoDB World 已经介绍过了,今年有做了多方面的增强,算得上是一个功能比较完备的 BI 分析工具了。有了 Charts,MongoDB 也无需支持 SQL 来去对接 BI 工具了。


Charts 在使用上还是有一定学习成本​​的,不是特别直观,需要配合教程,了解下运动原理,才能得到想要的图,比如这个例子里,针对电影集合,Released 的年份做了聚合分析,得到分布图。



MongoDB 领域


MongoDB 在 4 月份的时候收购了 Realm,一个为移动端开发而设计的新型数据库.MongoDB 去年发布了 MongoDB Mobile 来应对移动端的数据存储需求,在收购 Realm 后,二者会进行深度整合,Real Core 里会借助 MongoDB 提供的能力,增加非结构化数据存储到能力,比如 JSON,Dict,Set,让 Realm 变得更强大,同时发挥 Realm 在移动端生态以及 MongoDB 数据库存储的优势。




Atlas Data Lake(Beta)


在新版本 Atlas 服务里,提供了 Atlas Data Lake,能直接通过 MongoDB API 访问存储在 AWS S3(未来支持 Azure,Google 的存储服务)里的数据。



本文转载自云栖社区


原文链接


https://yq.aliyun.com/articles/706188?spm=a2c4e.11157919.spm-cont-list.92.146cf204yvK0Xp


2019 年 7 月 03 日 08:0010337

评论

发布
暂无评论
发现更多内容

牛排等级之美国篇

地藏@易果18916037281

Java并发编程基础--Synchronized

Java收录阁

线程

jenkins集成maven获取远程项目

kcnf

Redis学习笔记(散列类型)

编程随想曲

redis

地址收录

gogogo

关于架构的几件小事:架构是什么

北风

架构 企业架构

关于 DeepL 机器翻译能力

梁帅

产品 互联网 机器翻译 谷歌Google DeepL

最好的汇报是不需要汇报

伯薇

团队管理 领导力 沟通 汇报 可视化

我为什么不买Mac

Winann

效率 效率工具 Mac apple

MyBatis 3 解析Mapper映射配置

杨家昌

mybatis 配置 Mapper XMLMapperBuilder

没有业务规则的技术实现

wd

吐槽

在 TypeScript 处理空值异常

寇云

typescript 前端开发

开源一个自研的基于Netty的高性能网络通信框架

Geek_373e87

TCP dubbo Netty

iTerm2使用小技巧-密码管理器

小菜与老鸟

iTerm

第一篇InfoQ的博客

程序员小岑

写作 体验

深入理解Java中的Lambda表达式和函数式编程的关系

jerry

Lambda java8 函数编程

自助设备系列——自助设备的春天

孙苏勇

产品

一种消息消费失败的处理方案

redis kafka

回"疫"录(9):守住我们自己的净土

小天同学

疫情 回忆录 现实纪录 纪实

hive 建表语句迁移

杨飞

为什么很多技术都觉得前端很简单?

极客时间

前端 前端开发 前端工程

spring boot 集成 elasticsearch 7.x (一)

wd

elasticsearch high level client

讨论:应不应该用存储过程?

kimmking

算法篇之数组右移

月夜

算法 数组右移

这样理解Java中的函数式编程就对了

jerry

java8 函数编程

测试驱动开发英制单位转换

escray

学习 CSD 认证实战营

小米手机广告在日本「炸」了,背后的教训是什么?

葛仲君

产品 本地化 小米 日本 文化

央行:取消境外机构投资者额度限制,推动金融市场进一步开放

kimmking

Ubuntu 20.04 装机手册

小柒

Linux #Ubuntu #geek

专题:快速开发那点事儿 | 轮子怎么选

HPioneer

Java 敏捷开发 Ruoyi 快速开发

性能优化第一课:性能指标

kimmking

性能优化

MongoDB 4.2新特性解读-InfoQ