数据库受欢迎程度排行榜中,MongoDB一直居于前五。对于没有了解过MongoDB的朋友可能觉得MySQL就能满足日常业务,如果不行,还可以使用缓存、es等。但是MongoDB也有自己的独到之处,而且越来越多的公司与业务都在使用MongoDB。
MongoDB简介
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。
Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
MongoDB优势
- json数据结构,可以节省数据库结构的设计和ORM层编码的开发。
- 可以更加专注于业务编程,花更少的时间在数据库设计方面。
- 灵活的数据结构,可以快速响应业务需求的变化
- 从4.0开始,MongoDB已经支持事务
对比关系型数据库
标题 | MongoDB | RDBMS |
---|---|---|
数据模型 | 文档模型 | 关系模型 |
高可用 | 复制集 | 集群模式 |
横向扩展能力 | 通过原生分片完善支持 | 数据分区或者应用侵入 |
索引支持 | B+树,全文索引,地理位置索引,多键索引,TTL索引 | B+树 |
数据容量 | 没有理论上线 | 千万,亿 |
扩展方式 | 垂直扩展+水平扩展 | 垂直扩展 |
MongoDB数据模型
MongoDB最小存储单位就是文档(document)对象。类似于关系型数据库的行。数据在MongoDB中以BSON(Binary-json)文档的格式存储在磁盘上。
BSON是一种类json的二进制形式的存储格式。支持内嵌的文档对象和数组对象。具有轻量型、可遍历性、高效性三个特点,可以有效描述非结构化数据和结构化数据。这种格式优点是灵活性高,缺点是空间利用率不是很理想。
BSON格式缺点
正所谓成也萧何败也萧何。上面说到BSON格式优点是灵活性高,缺点是空间利用率不是很理想。
空间利用率可以忽略,多费点硬盘空间而已。
灵活性高,可以使业务变更更容易,但是也注定了对数据结构的约束很难。
docker搭建单机MongoDB
shell复制代码
#安装MongoDB容器
#-e MONGO_INITDB_ROOT_USERNAME创建管理员账号
#-e MONGO_INITDB_ROOT_PASSWORD=123456创建密码
docker run -d -p 27017:27017 --name mongodb -e MONGO_INITDB_ROOT_USERNAME=admin -e MONGO_INITDB_ROOT_PASSWORD=123456 mongo:5.0.9
#进入容器
docker exec -it mongodb /bin/bash
#登录mongo,登录的数据库是admin数据库
mongo localhost:27017 -u 'admin' -p '123456' --authenticationDatabase 'admin'
#创建数据库shop
use shop
#创建用户
#账号:root
#密码:123456
#角色:root
#管理数据库:admin
db.createUser({ user: 'sh', pwd: '123456', roles: [ { role: "dbOwner", db: "shop" } ] });
#插入数据
> db.shop.insert({name:123})
WriteResult({ "nInserted" : 1 })
MongoDB语法
新增
db.shop.insert({name:123})
查询
MySQL | MongoDB | |||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
a=1 | {a:1} | |||||||||||||||||||||||||||||
a1 | {a:{$ne:1}} | |||||||||||||||||||||||||||||
a>1 | {a:{$gt:1}} | |||||||||||||||||||||||||||||
a>=1 | {a:{$gte:1}} | |||||||||||||||||||||||||||||
a db.shop.remove({}) WriteResult({ "nRemoved" : 1 }) > > db.shop.insert({id:1,amount:100,status:1}) WriteResult({ "nInserted" : 1 }) > db.shop.insert({id:2,amount:200,status:1}) WriteResult({ "nInserted" : 1 }) > db.shop.insert({id:3,amount:300,status:1}) WriteResult({ "nInserted" : 1 }) > db.shop.insert({id:4,amount:400,status:2}) WriteResult({ "nInserted" : 1 }) > db.shop.count() 4 > db.shop.aggregate([{$match:{status:1}},{$group:{_id:"$id",total:{$sum:"$amount"}}}]) { "_id" : 3, "total" : 300 } { "_id" : 1, "total" : 100 } { "_id" : 2, "total" : 200 } > 常见步骤
|