MongoDB基础入门
目录
【认识MongoDB】
MongoDB是一个使用C++语言编写的基于分布式文件存储的数据库,是一个开源的、高性能、高扩展、无模式的文档型数据库,这里的文档指的是以JSON为数据模型的文档数据库。MongoDB设计的初衷就是为了简化开发和方便扩展,是NoSQL数据库产品中的一种,并且是最接近关系型数据库(如MySQL)的非关系型数据库。它支持的数据结构非常松散,使用类似于JSON的格式存储,既可以存储比较复杂的数据类型,又特别的灵活,没有了关系型数据库中字段的束缚。准确的说,MongoDB中记录的不是一个数据表(table),而是一个集合(collection)。而且MongoDB的横向扩展可以支撑很大的数据存储量和并发量。
MongoDB的使用场景
目前的互联网应用在数据操作中会有以下需求,也就是俗称的“三高”需求:
- High performance - 对数据库高并发读写的需求。
- Huge Storage - 对海量数据的高效率存储和访问的需求。
- High Scalability && High Availability- 对数据库的高可扩展性和高可用性的需求。
MongoDB在某些应用场景下具有优势,比如:数据量大、读写操作都很频繁、对事务性要求不高。例如下面这些应用场景:
- 电商场景:存储不同属性的商品信息,不同类别的商品拥有不同的属性,使用MongoDB的无固定字段的形式存储效率较高。
- 社交场景:存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能。
- 游戏场景:存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、高效率存储和访问。
- 物流场景:存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来。
- 物联网场景:存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析。
- 视频直播:存储用户信息、点赞互动信息等。
具体来说,如果你的业务中出现了以下特点,就可以考虑使用MongoDB来存储数据:
- 需求频繁变动,数据模型无法确定,想快速迭代开发;
- 需要很高的读写QPS(比如QPS2000以上);
- 需要TB甚至 PB 级别数据存储;
- 发展迅速,需要能快速水平扩展;
- 需要大量的地理位置查询、文本查询。
备注:这些场景并不是只能用MongoDB实现,使用传统的MySQL和Redis或者其他存储工具也能实现,只不过使用MongoDB会更加便捷和高效。MongoDB相比于MySQL的不足之处,就是不支持事务操作(MongoDB4.0之后已经可以支持事务(ACID)了,后面再细说);另外MongoDB也不支持join连表查询,但是可以使用内嵌文档的方式代替。
MongoDB的结构模型
上面说了MongoDB中没有“表”和“行”的概念,取而代之的是“集合”和“文档”。如下表格是对比MongoDB和MySQL的一些专有名词:
MySQL | MongoDB |
database 数据库 | database 数据库 |
table 表 | collection 集合 |
row 行 | document 文档 |
column 字段 | field 列 |
index 索引 | index 索引 |
一个MongoDB实例可以有多个数据库,不同的数据库存放在不同的文件中,这个和MySQL类似。MongoDB中默认会生成如下数据库:
- admin 数据库:权限数据库,如果创建用户的时候将该用户添加到admin 数据库中,那么该用户就自动继承了所有数据库的权限。
- config 数据库:当MongoDB 使用分片模式时,config数据库在内部使用,用于保存分片的信息。
- local 数据库:这个数据库永远不会被复制,可以用来存储本地单台服务器的任意集合。
上面的工具是MongoDB Compass,是一个图形化界面操作MongoDB的可视化工具。
MySQL的数据库中存储的是表,MongoDB的数据库中存储的是集合,集合就是一组文档,集合中的文档可以是各式各样的,例如,{“name”:“zhangsan”}和{“age”: 3},它们的键不同,值的类型也不同,但是它们可以存放在同一个集合中。在实际使用中,一般会将某一类有相关关系的文档存放在一个集合中。MongoDB并没有强制要求哪些文档放到哪些集合中,用户可以灵活选择。
MongoDB的最小存储单位就是文档(document)对象,数据在MongoDB中以BSON(Binary-JSON)的格式存储在磁盘上。一个文档的格式示例:
BSON(Binary Serialized Document Format)是一种类json的一种二进制形式的存储格式,简称Binary JSON。BSON和JSON一样,支持
内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date和BinData类型。
BSON采用了类似于 C 语言结构体的名称、对表示方法,支持内嵌的文档对象和数组对象,具有轻量性、可遍历性、高效性的三个特点,可
以有效描述非结构化数据和结构化数据。这种格式的优点是灵活性高,但它的缺点是空间利用率不是很理想。
文档中的值不仅可以是双引号中的字符串,也可以是其他的数据类型,例如:整型、布尔型等,也可以是另外一个文档,即文档可以嵌套。文档中的键类型只能是字符串。
MongoDB和关系型数据库的一些主要区别如下:
MongoDB | 关系型数据库 | |
数据模型 | 文档模型 | 关系模型 |
数据库类型 | OLTP | OLTP |
CRUD操作 | MQL(Mongo Query Language) | SQL(Structured Query Language) |
高可用 | 复制集 | 集群模式 |
横向扩展能力 | 通过原生分片实现横向扩展 | 数据分区或者分库分表 |
索引支持 | B树、全文索引、地理位置索引 | B树、B+树 |
数据容量 | 理论上没有容量上限 | 千万级别、亿级别 |
扩展方式 | 垂直扩展+水平扩展 | 垂直扩展 |
MongoDB的横向扩展能力对于开发人员来说是无感知的,底层是多种数据分布策略实现的分片架构,但是对外看到的还是单一的存储结构。通过这种黑盒式的横向扩展能力,可以支持海量数据和无缝扩容。
【安装MongoDB】
进入MongoDB官网下载适合自己操作系统的安装包,我这里下载4.2.24版本。
MacOS安装MongoDB
下载下来后,解压以及一系列设置命令:
sudo mkdir -p /data/db #mongodb默认存储数据的目录,可以修改
sudo chmod -R 777 /data/db/
tar -xvf mongodb-macos-x86_64-4.2.24.tgz
mv mongodb-macos-x86_64-4.2.24/ mongodb
cd mongodb/
./bin/mongod #启动MongoDB服务
./bin/mongo #启动MongoDB客户端
推荐将MongoDB的程序目录加入到环境变量:
vim .bash_profile
#写入
export PATH=/Users/renxing/soft/mongodb/bin:$PATH;
source .bash_profile
#然后,就可以在任意目录下直接使用 mongod 和 mongo 命令了。
可以设定配置文件, 在 /Users/renxing/soft/mongodb/conf目录,增加配置文件mongo.conf,以下参数根据需要可选:
dbpath=/Users/renxing/soft/mongodb/data/db/ #数据保存路径
logpath=/Users/renxing/soft/mongodb/logs/mongo.log #日志保存路径
pidfilepath=/Users/renxing/soft/mongodb/pids/mongo.pid #进程描述文件
logappend=true #日志追加写入
bind_ip_all=true
port=27017 #mongodb默认端口
oplogSize=10000 #操作日志容量
fork=true #开启子进程
添加配置信息后,可以通过配置文件启动mongo服务端和客户端:
#带参数启动mongodb服务端
mongod -f /Users/renxing/soft/mongodb/conf/mongo.conf
##带参数启动mongodb客户端
mongo --host 127.0.0.1 --port 27017
Linux下的安装方式和Mac类似,不再赘述。
Windows安装MongoDB
同样进入官网,下载msi格式的文件,然后点击安装。建议修改安装路径,不要装在C盘,我这里装在D盘。
接下来,可以选择不勾选“Install MongoDB Compass”,因为安装这个客户端比较耗费时间,我这里还是勾选上了,等待差不多1个小时左右。 也可以不勾选,自己安装一个“Navicat Premium”作为客户端使用。
安装完成:
把安装目录加入到系统Path:
客户端连接
推荐使用 Navicat Premium 连接MongoDB,可以看到图形化界面:
#对应的语句
db.getCollection("user").insert( { name: "zhangsan", age: 20, info: { address: "beijing", phone: "12345678" } } )
db.getCollection("user").find().limit(1000).skip(0)
使用命令行建库、添加数据的语句如下:
> show dbs #查看当前有哪些数据库
admin 0.000GB
config 0.000GB
local 0.000GB
> use test #切换到test库,如果不存在,则会直接创建
switched to db test
> show collections #查看当前库下面的集合
> db.createCollection('user') #创建一个集合
{ "ok" : 1 }
> db.getCollection("user").insert( { name: "zhangsan", age: 20, info: { address: "beijing", phone: "12345678" } } ) #插入数据
WriteResult({ "nInserted" : 1 })
> db.getCollection("user").find().limit(1000).skip(0) #查找数据
{ "_id" : ObjectId("649fb2cff641c3bddd5ba1a3"), "name" : "zhangsan", "age" : 20, "info" : { "address" : "beijing", "phone" : "12345678" } }
MongoDB的企业版在生产环境是收费的,开发环境免费;MongoDB的社区版在所有环境都可以免费使用。
关于MongoDB集群可以进入 https://cloud.mongodb.com/ 操作。
参考资料:
https://blog.csdn.net/weixin_42039228/article/details/123657641
https://blog.csdn.net/weixin_43405300/article/details/120017878
更多推荐
所有评论(0)