MongoDB入门
近这段时间项目上使用到了Mongo数据库,于是了解了一下Mongo数据库
简单介绍
MongoDB是一个基于分布式文件存储的数据库
由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引
MongoDB是一种NoSQL数据库管理系统,它使用文档数据模型来存储数据。相对于传统的关系型数据库,MongoDB具有更高的灵活性和可伸缩性。
MongoDB的数据以BSON(二进制JSON)格式存储,这种格式比JSON更加紧凑,因此可以更快地读写数据。MongoDB还提供了强大的查询功能,可以根据多个条件进行查询,并支持索引,以便更快地访问数据。
在MongoDB中,数据被组织为集合(Collection)和文档(Document)。集合类似于传统的表格,而文档则类似于JSON对象。文档可以包含任意数量的字段,每个字段都可以是不同的数据类型,包括字符串、数字、日期等等。
MongoDB还支持复制和故障转移,以确保在节点故障或网络中断的情况下,数据仍然可以可靠地访问。此外,MongoDB还具有内置的分片功能,可以将数据分布到多个服务器上,以实现更好的可伸缩性。
Mongo数据库的优点
- 灵活的数据模型:MongoDB采用文档型数据库的数据模型,可以存储和处理各种类型的数据,具有很高的灵活性。
- 高可扩展性:MongoDB支持横向扩展,可以轻松地添加更多的节点来处理大规模数据和高并发请求。
- 高性能:MongoDB使用内存映射文件的存储引擎,具有快速的读写性能。它还支持索引和复制等功能,提供了高效的数据访问和冗余备份。
- 高可用性:MongoDB支持自动的数据复制和故障转移,通过复制集和分片集群等机制来提供高可用性和容错能力。
- 丰富的查询功能:MongoDB提供了强大的查询语言和丰富的查询操作符,可以轻松进行复杂的查询和聚合操作。
- 社区支持和生态系统:MongoDB拥有庞大的开发者社区和活跃的生态系统,可以找到很多现成的工具和库来支持开发和管理。
- 总结一下:- Free-schema无模式文档,适应非结构化数据存储;内置GridFS,支持大容量的存储; 内置Sharding,分片简单;弱一致性(最终一致),更能保证用户的访问速度;查询性能优越,对于千万级别的文档对象,差不多10个G,对有索引的ID的查询不会比MySQL慢,而对非索引字段的查询,则是完胜MySQL;聚合框架,它支持典型几种聚合操作 , 比如,Aggregate pipelien, Map-Reduce等;支持自动故障恢复
Mongo数据库的缺点
- 内存消耗:由于MongoDB使用内存映射文件的存储引擎,其数据存储在内存中,因此需要较大的内存空间来存储数据和索引。
- 占用磁盘空间:MongoDB的存储方式可能造成数据冗余,占用较多的磁盘空间。
- 不适合复杂的事务处理:MongoDB在事务处理方面的支持相对较弱,不适合处理复杂的事务操作。
- 学习曲线:相对于传统的关系型数据库,MongoDB的学习曲线可能较陡峭,需要开发人员适应其特有的查询语言和数据模型。
- 总结一下:太吃内存,快是有原因的,因为MongoDB把数据都放内存里了;对事务的支持不够友好;占用空间过大;对联表查询的支持不够强大;只有最终一致性,言外之意,就是可能造成数据的不一致,如果想要保持强一致性,必须在一个服务器处理所有的读写操作,坑;复杂聚合操作通过mapreduce创建,速度慢;Mongodb全局锁机制也是个坑;预分配模式会带来的磁盘瓶颈;删除记录时不会释放空间,相当于逻辑删除,这个真的坑;MongoDB到现在为止,好像还没有太好用的客户端工具;
什么时候该选择Mongo数据库呢?
- 数据模型的灵活性:如果你的应用程序需要处理非结构化或半结构化数据,MongoDB提供了更灵活的数据模型,可以轻松地存储和查询这些类型的数据。
- 大规模数据存储和高吞吐量:MongoDB在处理大规模数据存储和高吞吐量方面表现良好。如果你的应用程序需要处理大量的数据或需要高性能的读写操作,MongoDB可以提供较好的性能。
- 分布式架构和横向扩展:MongoDB支持分布式架构和横向扩展,可以轻松地将数据分片并扩展到多个服务器上。这使得MongoDB成为处理大规模数据和高并发访问的理想选择。
- 弹性和容错性:MongoDB具有自动故障恢复和数据冗余功能,可以提供高可用性和容错性。如果你的应用程序对数据的可靠性和持久性有较高要求,MongoDB是一个不错的选择。
总体而言,MongoDB适用于那些对数据模型灵活性要求较高,需要处理大规模和高并发数据的应用程序。
MongoDB与MySQL关键字对比
MySQL | MongoDB | 解释说明 |
---|---|---|
database | database | 数据库 |
table | collection | 表/集合 |
row | document | 行/文档 |
column | field | 字段/域 |
index | index | 索引 |
join | 嵌入文档 | 表关联/MongoDB不支持join,MongoDB通过嵌入式文档来替代多表连接 |
primary key | primary key | 主键/MongoDB自动将_id字段设置为主键 |
2、集合相当于MySQL中的表
集合就是一组文档。可以看作是具有动态模式的表。
集合具有动态模式的特性。这意味着一个集合中的文档可以具有任意数量的不同形态。
但是,将不同类型的文档存放在一个集合中会出现很多问题:
- 文档中可以存放任意类型的变量,但是,这里不建议将不同类型的文档保存在同一个集合中,开发人员需要确保每个查询只返回特定模式的文档,或者确保执行查询的应用程序代码可以处理不同类型的文档;
- 获取集合列表比提取集合中的文档类型列表要快得多,减少磁盘查找次数;
- 相同类型的文档存放在同一个集合中可以实现数据的局部性,对于集合,让使用者见文知意;
- 集合中只存放单一类型的文档,可以更高效地对集合进行索引;
3、集合的命名
- 集合名称中不能是空字符串;
- 集合名称不能包含
\0
(空字符),因为这个字符用于表示一个集合名称的结束; - 集合名称不能以
system.
开头,该前缀是为内部集合保留的。 - 集合名称不能有$,只能在某些特定情况下使用。通常情况下,可以认为这两个字符是MongoDB的保留字符,如果使用不当,那么驱动程序将无法正常工作。
4、文档相当于MySQL中的行
文档是MongoDB中的基本数据单元,相当于传统关系型数据库中的行,它是一组有序键值的集合。每个文档都有一个特殊的键“_id”,其在所属的集合中是唯一的。
文档中的键是字符串类型。
键中不能含有\0(空字符)。这个字符用于表示一个键的结束。 .和$是特殊字符,只能在某些特定情况下使用。通常情况下,可以认为这两个字符是MongoDB的保留字符,如果使用不当,那么驱动程序将无法正常工作。
5、游标
数据库会使用游标返回find的执行结果。游标的客户端实现通常能够在很大程度上对查询的最终输出进行控制。你可以限制结果的数量,跳过一些结果,按任意方向的任意键组合对结果进行排序,以及执行许多其他功能强大的操作。
通过cursor.hasNext()
检查是否还有其它结果,通过cursor.next()
用来对其进行获取。
调用find()时,shell并不会立即查询数据库,而是等到真正开始请求结果时才发送查询,这样可以在执行之前给查询附加额外的选项。cursor对象的大多数方法会返回游标本身,这样就可以按照任意顺序将选项链接起来了。
在使用db.users.find();
查询时,实际上查询并没有真正执行,只是在构造查询,执行cursor.hasNext()
,查询才会发往服务器端。shell会立刻获取前100个结果或者前4MB的数据(两者之中的较小者),这样下次调用next或者hasNext时就不必再次连接服务器去获取结果了。在客户端遍历完第一组结果后,shell会再次连接数据库,使用getMore请求更多的结果。getMore请求包含一个游标的标识符,它会向数据库询问是否还有更多的结果,如果有则返回下一批结果。这个过程会一直持续,直到游标耗尽或者结果被全部返回。
6、游标的生命周期
在服务器端,游标会占用内存和资源。一旦游标遍历完结果之后,或者客户端发送一条消息要求终止,数据库就可以释放它正在使用的资源。
何时销毁游标:
- 当游标遍历完匹配的结果时,它会消除自身;
- 当游标超出客户端的作用域时,驱动程序会向数据库发送一条特殊的消息,让数据库终止该游标;
- 如果10分钟没有被使用的话,数据库游标也将自动销毁;
基本命令
查看数据库 :show databases
使用数据库:use 数据库名
查看集合: show collections
db.集合名.find()查询某个集合的数据
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!