这周我去看了我的高中同学。我还是很高兴的。本来打算写MySQL数据库事务的实现或者MySQL优化系列的文章,但是一直没有想过这些知识怎么组装。

本周只需改变方向并编写 NOSQL。考虑到有的同学对JSON不太了解,我们先介绍一下MongDB的基本概念,然后解释一下为什么要引入MongDB,然后再解释一下如何使用。

是什么?什么

MongoDB 是一个文档数据库,旨在简化应用程序开发和扩展

MongoDB 是为高可扩展性和高可用性而设计的文档数据库。

请注意,MongoDB 是一个文档数据库。文档数据库和我们常见的关系数据库有什么区别?我们先来看看这个文档,也就是文档是什么意思?

MongoDB 中的记录是一个文档,它是由字段和值对组成的数据结构。 MongoDB 文档类似于 JSON 对象。字段值可以包括其他文档、数组和文档数组。

关于什么是 JSON?请参阅我的文章:愚蠢的 JSON?

因此,MongDB 的记录是一个类似于 JSON 对象的文档。 MongDB 将文档存储在集合中,类似于关系数据库中的表。访问关系类似于下图:

上面我们提到过,MongDB 的记录是一个类似于 JSON 的文档。之所以类似,是因为MongDB采用了BSON。 BSON u003d Binary JSON,即二进制形式的 JSON。同时,它扩展了 JSON 并具有 JSON 所不具备的数据类型,例如日期类型和 bindata 类型。

为什么要引入MongoDB?

那为什么要介绍MongoDB呢?或者 MongoDB 相对于关系数据库的优势是什么?

十年前,当我和 Dwight 开始这个项目(后来成为 MongoDB)时,我们完全没想到它会像今天这样。我们只有一个信念:让开发者更有效率。 MongoDB 的诞生源于在大型复杂业务部署中使用关系数据库的挫败感。我们着手建立一个我们想要使用的数据库。这样,无论何时开发人员想要编写一个应用程序,他们都可以专注于应用程序本身而不是数据库。 MongoDB十年,创始人回顾

所以在某些领域,MongoDB可以让开发者更有效率。

我知道有一个问题:MongoDB等NoSQL与关系型数据库相比有哪些优缺点和适用场景? MongDB 的一位开发者回答了以下问题。在这里,我将简要摘录他的答案:

  • 面向对象模型更类似于JSON数据模型。与关系数据库中的表结构不同,数组和子文档 (JSON) 可以嵌入到文档 (JSON) 中,就像程序中的数组和成员变量一样。这在关系数据库的三种范式中是不允许的。但在实践中,我们经常会看到一对多和一对一的数据。比如一篇博文的Tag列表作为文章的一部分是很直观的,但是把Tag和文章的依赖关系放在一个单独的表中就不是那么自然了。 SQL语音可以准确表达。但是,三种范式都强调数据没有冗余,这不是当今程序员最关心的问题。更重要的问题是它们是否方便使用。

在这里,我们来到了 MongoDB 相对于关系数据库的第一个优势。在某些场景下,MongoDB 比关系数据库更方便。请注意,在某些情况下。

  • 性能

三种范式带来的jojn有时候为了满足一个查询需要join多张表,但是join多张表的代价是随着数据的提高,查询速度会变得很慢。更简单的访问方式可以让开发人员更容易了解数据库的性能。一个典型的场景是我加入了十个表。在这种情况下,如何添加索引以获得最佳查询速度。

  • 柔性

如果您需要添加字段,您可能需要将它们从数据库更改到应用程序层。虽然有些工具可以自动化它,但它仍然是一项复杂的工作。没有Schema,MongDB不需要改变数据库,只需要在应用层做必要的改变。 (这句话可以这样理解,仔细看上面MongDB访问数据的示意图,现在访问集合的同学有3个字段,其实MongDB允许文档有不同的字段)

自定义属性也是一个问题。比如LCD显示屏和LED显示屏的产品特性是不同的。数据的这种特性称为多态性。关系型数据库中产品表应该如何设计?一般来说,最简单的解决方案是将每个可能的属性变成一个单独的列,但如果显示器厂商每年推出一个新功能,表格将不得不频繁更换,可扩展性不强。另一个更极端的场景是通讯录允许用户随意添加新的联系信息。一种方案是将此自定义联系人信息放在一列中,并将其存储在 json 中。

MongDB的灵活性还体现在非结构化和半结构化数据上。 MongDB提供全文索引,支持地理位置查询和索引。例如,用户想知道方圆五公里内哪里有公共厕所。这是“地理范围查询”。然后他搜索了最近的自行车。 Moby Bike 使用 MongoDB 来完成这样的“距离排序查询”。强烈建议使用地理位置索引来加快查询速度,因为我能理解用户的心情。

  • 可扩展性

MongoDB有自己的分区,对应关系型数据库的数据库和表。

  • 哪些场景不适合MongoDB

MongDB的开发者周思源给出了一个场景。他需要一个项目中的地铁时刻表。官方提供的数据是符合行业标准的SQL格式,也就是按照三种范式分成几张表。然后他花了一整夜将数据库导入MongDB。但他说如果再做一次,可能会直接选择关系型数据库,因为如果源数据格式是SQL数据,没有控制,数据量小;凭借丰富的交叉引用关系、丰富的查询模式以及不需要高性能的应用程序,关系数据页也是一种实用的选择。

我对这句话的理解是,从应用数据建模的角度来看,在某些场景下,关系型数据库提供的SQL在统计、查询和分析方面还是有很强的优势的。

怎么用?

有了what和why,我们就可以开始使用了,也就是安装使用。好在MongDB有中国人维护的中文操作手册:

介绍很详细。还有安装教程和免费试用:

所以对我来说,我选择了面试和尝试。点击进去。我选择的开发场景是开发微服务。您也可以选择在本地安装。本手册中的安装教程还是很详细的。这里就不做详细介绍了,就放个地址吧。https://docs.mongoing.com/ins...

但是,对于云中的这种数据库,安装 MongDB shell 可能会有些麻烦。好久没有在windows上安装成功了。在这里您可以使用 MongDB GUI。下载地址如下:

zoz100037 https://doonloads.mongodb.com...](https://downloads.mongodb.com/compass/mongodb-compass-1.30.1-win32-x64.exe)

只需填写JSON

Java操作MongoDB

现在让我们尝试使用它。我在第一次遇到时谈论的是一些基本功能,例如CRUD。首先,驱动程序必须连接到数据库:

<依赖>

<groupId>org.mongodb</groupId>

<artifactId>mongo-java-driver</artifactId>

<版本>3.12.5</版本>

</依赖>

与数据库打交道的增删改查的基本步骤一般是获取连接,然后发送语句。在MongDB的java驱动中,增删改查与Document和Bson这两个类相关:

当我们添加一个新对象时,它就是一个新的 Document,就像它失去了价值一样。过滤器用于构造条件对象和查询:

Filters.ne 不等于

Filters.gt 大于

Filters.and(Filters.eq("age",2222)),Filters.eq("name","aaa") 甚至相等

Filters.gte 大于或等于

Filters.lt 小于

Filters.lte 小于或等于

过滤器.in()

Filters.nin() 不在

从本质上讲,Filters 是为了帮助你传递运算符。我们也可以借助 Document 实现同样的效果:

new Document("name","张三") u003d Filters.eq("name","张三")

new Document("age",new Document("$eq",24)) u003d Filters.eq("name","张三")

new Document("age",new Document("$ne",24)) u003d Filters.ne("name","张三")

我们主要使用MongoCollection来完成MongDB的增删查改。添加的内容主要与Document相关。使用Filters和Document可以实现修改、删除和查询。

  • 增加

@测试

void contextLoads() 抛出异常 {

ConnectionString connectionString u003d new ConnectionString("mongodb+srv://study:a872455@cluster0.exlk2.mongodb.net/myFirstDatabase?retryWritesu003dtrue&wu003dmajority");

MongoClientSettings 设置 u003d MongoClientSettings.builder()

.applyConnectionString(连接字符串)

.build();

MongoClient mongoClient u003d MongoClients.create(settings);

插入文档演示(mongoClient);

}

公共无效 insertDocumentDemo(MongoClient mongoClient) 抛出异常 {

MongoDatabase 数据库 u003d mongoClient.getDatabase("test");

database.getCollection("研究");

MongoCollection<文档> study u003d database.getCollection("study");

// 编号名称 id 存储在学习表中。如果是关系型数据库,我们需要先在表中添加字段,然后再添加属性,

// 现在我们直接在 MongoDB 中添加

地图<String,Object> 地图 u003d 新哈希地图<>();

map.put("数字","bbb");

map.put("名称","aaa");

map.put("id","1111");

map.put("年龄",2222);

文档文档 u003d 新文档(地图);

study.insertOne(文档);

}

结果:

  • 删除

公共无效删除文档(MongoClient mongoClient){

MongoDatabase 数据库 u003d mongoClient.getDatabase("test");

database.getCollection("研究");

MongoCollection<文档> study u003d database.getCollection("study");

// eq为equals运算符,filters eq("age", 2222)表示检测到age u003d 2222的物体并定位

study.deleteOne(Filters.eq("age",2222));

}

  • 更改

公共无效更新文档(MongoClient mongoClient){

MongoDatabase 数据库 u003d mongoClient.getDatabase("test");

database.getCollection("研究");

MongoCollection<文档> study u003d database.getCollection("study");

study.updateOne(Filters.eq("age",2222),new Document("$set",new Document("name","22222")));

}

  • 检查

公共无效选择文档(MongoClient mongoClient){

MongoDatabase 数据库 u003d mongoClient.getDatabase("test");

MongoCollection<Document> studyTable u003d dataBase.getCollection("study");

// age可以是一个数组,所有值都必须是2222

Bson 条件 u003d Filters.all("年龄", 2222);

FindIterable<Document> documentList u003d studyTable.find(条件);

}

最后总结一下

某种程度上,我们都是从真实数据中取出数据,处理后发送到数据库中,然后根据用户的请求取出数据库中的数据。但是,现实世界中的数据结构多种多样,关系数据库功能强大,赶不上现场。比如我们在上面讨论了为什么要引入 MongDB,另外一个场景是描述数据之间的关系,比如组织结构和人际图。当数据量很大时,关系数据库面临查询速度慢的问题。为了描述这种非线性关系,图数据库应运而生。不同的数据库处理不同的数据描述场景。

参考资料

  • MongoDB中文手册 |官方文档中文版https://docs.mongoing.com/

  • MongoDB等NoSQL与关系型数据库相比有哪些优势、劣势和适用场景?https://www.zhihu.com/questio...

  • BSON官网https://bsonspec.org/#/

  • java操作mongodb --查询数据https://www.cnblogs.com/simpl...

Logo

MongoDB社区为您提供最前沿的新闻资讯和知识内容

更多推荐