目录

【认识MongoDB】

MongoDB的使用场景

MongoDB的结构模型

【安装MongoDB】 

MacOS安装MongoDB

Windows安装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的一些专有名词:

MySQLMongoDB
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关系型数据库
数据模型文档模型关系模型
数据库类型OLTPOLTP
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

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐