安装
使用 brew 安装
brew install mongodb
运行 MongoDB
1、首先我们创建一个数据库存储目录 /data/db:
mkdir -p /data/db
2、启动mongo
sudo mongo
http://localhost:8080/user/zhangsan
概述
MongoDB 是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
结构:MongoDB结构分为:文档(行)、集合(表)、数据库。
特性
事务
MongoDB 目前只支持单文档事务,需要复杂事务支持的场景暂时不适合。
单文档事务
在早期,我们说的MongoDB支持事务是指针对MongoDB的单文档级别,与我们MySQL等关系型数据库中的事务是不同的,那什么是单文档事务呢?
>db.username.update({'name': 'helei'}, {$set: {'age': 26, 'score': 85}})
上述命令对username集合中,name为helei列的行进行更新,如果age更新为26,score由于宕机或其他原因导致更新失败,那么MongoDB则会回滚这一操作。
Part2:单文档ACID实现
MongoDB在更新单个文档时,会对该文档加锁,而要理解MongoDB的锁机制,需要先了解以下几个概念:
- Intent Lock, 意图锁表明读写方(reader-writer)意图针对更细粒度的资源进行读取或写入操作。例如:如果当某个集合被加了意向锁,那么说明读、写方意图针对该集合中的某个文档进行读或写的操作。
- MGL多粒度锁机制(Multiple granularity locking ),有S锁(Shared lock), IS锁(Intent Share lock), X锁(Exclusive lock),IX锁(Intent Exclusive lock)
MongoDB会为name为helei的文档加上X锁,同时为包含该文档的集合,数据库和实例都加上意向写锁(IX),这时,针对该文档的操作就保证了原子性。
多文档事务
MongoDB 4.0 将支持多文档事务,届时MongoDB将成为唯一能够同时支持速度,灵活性,JSON文档模型优势和ACID数据完整性保证的数据库。通过快照隔离,(MongoDB)的事务能够提供一个全局一致的数据视图,并可以实现all-or-nothing的事务提交及回滚机制,保证数据的完整性。
使用场景:
更高的写入负载
默认情况下,MongoDB更侧重高数据写入性能,而非事务安全,MongoDB很适合业务系统中有大量“低价值”数据的场景。但是应当避免在高事务安全性的系统中使用MongoDB,除非能从架构设计上保证事务安全。
高可用性
MongoDB的复副集(Master-Slave)配置非常简洁方便,此外,MongoDB可以快速响应的处理单节点故障,自动、安全的完成故障转移。这些特性使得MongoDB能在一个相对不稳定(如云主机)的环境中,保持高可用性。
数据量很大或者未来会变得很大
依赖数据库(MySQL)自身的特性,完成数据的扩展是较困难的事,在MySQL中,当一个单达表到5-10GB时会出现明显的性能降级,此时需要通过数据的水平和垂直拆分、库的拆分完成扩展,使用MySQL通常需要借助驱动层或代理层完成这类需求。而MongoDB内建了多种数据分片的特性,可以很好的适应大数据量的需求。
基于位置的数据查询
MongoDB支持二维空间索引,因此可以快速及精确的从指定位置获取数据。
表结构不明确,且数据在不断变大
在一些传统RDBMS中,增加一个字段会锁住整个数据库/表,或者在执行一个重负载的请求时会明显造成其它请求的性能降级。通常发生在数据表大于1G的时候(当大于1TB时更甚)。 因MongoDB是文档型数据库,为非结构货的文档增加一个新字段是很快速的操作,并且不会影响到已有数据。另外一个好处当业务数据发生变化时,是将不在需要由DBA修改表结构。
没有DBA支持
如果没有专职的DBA,并且准备不使用标准的关系型思想(结构化、连接等)来处理数据,那么MongoDB将会是你的首选。MongoDB对于对像数据的存储非常方便,类可以直接序列化成JSON存储到MongoDB中。 但是需要先了解一些最佳实践,避免当数据变大后,由于文档设计问题而造成的性能缺陷。
示例:京东的留言系统
Tailable Cursors
MongoDB 有一个叫 Tailable Cursors的特性,它类似于tail -f 命令,你在一个Capped Collection上面执行查询操作,当操作完成后,你可以不关闭返回的数据Cursor,并持续地从中读出新加入的数据。
In MongoDB tailable cursors can only be opened on capped collections. This is because a capped collection is a fixed size and only allows insertions. This means that once the number of documents exhausts the collection size, newly written documents will start overwriting the first inserted documents.
在高写入的 固定集合(Capped Collection)上,索引不可用时,可使用Tailable Cursors。例如,MongoDB复制使用了Tailable Cursors来获取Primary的尾oplog日志。
考虑以下与Tailable Cursors相关的行为:
- Tailable Cursors不使用索引,并以自然排序返回文档。
- 因为Tailable Cursors不使用索引,查询的初始扫描非常耗性能;但是,游标初始化完后,随后获取到的新增加的文档是很快速的。
- Tailable Cursors如果遇到以下情况之一将会僵死或无效:
(1)查询无匹配结果。
(2)游标在集合尾部返回文档,随后应用程序删除了该文档。
僵死的游标id为0。
cursor.tailable() — MongoDB Manual
http://shtylman.com/post/the-tail-of-mongodb/
public interface MyEventRepository extends ReactiveMongoRepository<MyEvent, Long> {
@Tailable
Flux<MyEvent> findBy();
}
参考:
MongoDB CRUD Operations — MongoDB Manual
别再用 MongoDB 了! - 开源中国