MongoDB 4.2 新特性解读

img_f8addfccdd1ad7d46cce6fc3c5636a0b.png云数据库 MongoDB 版

基于飞天分布式系统和高性能存储,提供三节点副本集的高可用架构,容灾切换,故障迁移完全透明化。并提供专业的数据库在线扩容、备份回滚、性能优化等解决方案。

了解更多

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

Full Text Search

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

MongoDB FTS 原理

  1. 用户可以在 Atlas 上,对集合开启全文索引,后台会开起 Lucene 索引引擎(索引引擎、查询引擎均可配置),对存量数据建立索引。
  2. 对于开启全文建索的集合,新写入到 MongoDB 的数据, 后台的服务会通过 Change Stream 的方式订阅,并更新到 Lucene 索引引擎里。
  3. 索引的查询直接以 MongoDB Query 的方式提供,Mongod 收到请求会把请求转发到 Lucene 引擎,收到建索结果后回复给客户端。

Full Text Search 示例

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

Step1: 准备数据

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." }

Step2: Atlas 上创建 FTS 索引

Step3: 使用 MongoDB 客户端做搜索,支持 Wildcard、Prefix 等多种搜索能力

// 简单查询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." }

Distributed Transaction

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

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

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

High Availablity

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

Improved Query Language

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

Update 能力增强

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

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

分析能力增强

Aggregation 方面,MongoDB 也做了大量的改进,来更好的支持业务分析场景;比如增加 操作符,能不断的将增量分析结果与原来的结果进行汇总(老的版本只支持merge操作符,能不断的将增量分析结果与原来的结果进行汇总(老的版本只支持out,把当次分析结果写到某个集合)。

Index 能力增强(Wildcard Index)

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

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

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",
}

Field Level Encrytion

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

MongoDB and Kubernetes

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

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

MongoDB Chart

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

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

MongoDB Realm

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 的存储服务)里的数据。

 

img_f8addfccdd1ad7d46cce6fc3c5636a0b.png云数据库 MongoDB 版

基于飞天分布式系统和高性能存储,提供三节点副本集的高可用架构,容灾切换,故障迁移完全透明化。并提供专业的数据库在线扩容、备份回滚、性能优化等解决方案。


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/518610.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java-类与对象的创建

// 学生类 public class Student {// 属性String name; // 默认 nullint age; // 默认 0// 方法public void study(){System.out.println(this.name " 在学习");} }public class Application {public static void main(String[] args) {// 实例化后会返回一个自己…

Spark3.0发布了,代码拉过来,打个包,跑起来!| 附源码编译

作者 | 敏叔V587责编 | 徐威龙封图| CSDN 下载于视觉中国Spark3.0已经发布有一阵子了,官方发布了预览版,带来了一大波更新,对于我们程序员来说,首先当然是代码拉过来,打个包,跑起来!&#xff01…

MySQL单表数据不要超过500万行:是经验数值,还是黄金铁律?

今天,探讨一个有趣的话题:MySQL 单表数据达到多少时才需要考虑分库分表?有人说 2000 万行,也有人说 500 万行。那么,你觉得这个数值多少才合适呢? 曾经在中国互联网技术圈广为流传着这么一个说法&#xff1…

Java-构造器

一个类即使什么都不写,它也会存在一个方法 package oop.demo02;/*** author blake.wang* date 2021-04-19 18:58*/ public class Person {// 一个类即使什么都不写,它也会存在一个方法,具体可以看一个空 类 的编译后的class文件// 显示的定…

IntelliJ IDEA 2020 基础设置

文章目录1. 字体设置2. 编码设置3. jdk设置4. 自动引入包和删除无用引入的包5. 打开文件左右联动定位1. 字体设置 菜单字体 编辑区 控制台 收缩自如 2. 编码设置 3. jdk设置 4. 自动引入包和删除无用引入的包 5. 打开文件左右联动定位

跟面试官侃半小时MySQL事务隔离性,从基本概念深入到实现

来源 | 阿丸笔记提到MySQL的事务,我相信对MySQL有了解的同学都能聊上几句,无论是面试求职,还是日常开发,MySQL的事务都跟我们息息相关。而事务的ACID(即原子性Atomicity、一致性Consistency、隔离性Isolation、持久性D…

Java-封装

// 类 public class Student {// 属性私有private String name; // 名字private int id; // 学号private char sex; // 性别private int age; // 年龄// 提供一些可以操作这个属性的方法// 提供一些 public 的 get \ set 方法// get 获得这个数据public String getName(){r…

一条数据的漫游奇遇记

数据库存储引擎是一个有历史的技术,经过数十年的发展,已经出现很多优秀成熟的产品。阿里巴巴 X-Engine 团队撰写的论文 "X-Engine: An Optimized Storage Engine for Large-scale E-Commerce Transaction Processing",详细讲述了团…

idea 编辑区设置

文章目录1. 显示行号2. tabs位置3. tabs排序4.tabs数量5.1. 显示行号 2. tabs位置 3. tabs排序 鼠标按住上下拖拽 按字母排序 4.tabs数量 5.

支付宝玉伯:从前端到体验,如何把格局做大

国内的前端行业,是一个群星璀璨,同时又有些纷纷扰扰的圈子。很多初出茅庐的年轻人怀着改变世界的梦想,谁也不服谁。不过,有一些为前端领域做出贡献的拓荒者几乎受到所有人的尊敬,玉伯就是这些拓荒者中的一员。 如今&am…

Java-继承

一个父类可以有多个子类,但是一个子类只能有一个父类 Person // 在java中,所有的类,都直接或者间接继承Object类 // person 人 父类 public class Person {// public > protected > default > private// public// protected --…

2019报告:AI程序员人才需求暴涨35倍!每10个公司就有6个人才缺口

就在最近,斯坦福大学AI研究所发布了《 2019 年 AI 指数报告》,其中一条数字让笔者震惊:58% 的受访大公司表示,2019 年至少在一个业务部门采用了 AI那就是说,近半数以上的公司都需要AI人才!但是现…

高效代码编辑功能

文章目录1. 行内跳转和选中2. 文件快速切换3. 查看最近查看过的文件4. 打开文件所在文件夹5.导航栏文件切换6. 查找和替换1. 行内跳转和选中 home跳转当前行首 end跳转当前行尾 按住ctrl左右快速按照单词跳转 按住ctrlshrift左右快速选中 2. 文件快速切换 alt左右 3. 查看最…

AnalyticDB for PG 如何作为数据源对接帆软 FineBI

AnalyticDB for PostgreSQL 基于开源数据库 Greenplum 构建,兼容Greenplum 和 PostgreSQL 的语法,接口和生态。本章节介绍如何通过FineBI连接 分析型数据库PostgreSQL版 并进行报表开发。 准备工作 开始使用FineBI之前,用户需要先完成以下准…

推出超低功耗数字式热释电传感器,翠展微电子厉害了……

近日,翠展微电子宣布推出了一款针对人体被动红外(PIR)应用的超低功耗数字芯片M1601。 据了解该方案通过热释电红外传感器以非接触方式检测出人体辐射的信号,并将该信号转换成电信号输入到芯片中进行信号处理。芯片的工作电流极低…

云上的Growth hacking之路,打造产品的增长引擎

增长关乎产品的存亡 增长!增长!增长!业务增长是每一个创业者每天面临的最大问题。无论你的产品是APP,还是web,或者是小程序,只能不断的维持用户的增长,才能向资本市场讲出一个好故事&#xff0…

在容器上构建持续部署及最佳实践初探

作者 | 倚天码农责编| 徐威龙封图| CSDN下载于视觉中国要想理解持续集成和持续部署,先要了解它的部分组成,以及各个组成部分之间的关系。下面这张图是我见过的最简洁、清晰的持续部署和集成的关系图。图源:sonatype.com持续部署如图所示&…

阿里开源!云原生应用自动化引擎 OpenKruise | 直击 KubeCon

在近期开展的 KubeCon China 2019 上,阿里云将陆续为全球用户分享阿里巴巴超大规模云原生落地实践、云原生前沿技术与应用包括 OpenKruise 开源项目、开放云原生应用中心(Cloud Native App Hub),同时将重磅发布边缘容器、云原生应…

Java-方法重写

方法重写只针对非静态方法,且不能是 private 类型的 如果是静态方法 // 重写都是方法的重写,和属性无关 public class B {public static void test() {System.out.println("B>test()");} }// 继承 public class A extends B{public stati…

数据库设计的 10 个最佳实践

作者 | Emily Williamson译者 | 孙薇,责编 | 屠敏出品 | CSDN(ID:CSDNnews)以下为译文:数据库是应用及计算机的核心元素,负责存储运行软件应用所需的一切重要数据。为了保障应用正常运行,总有一…