文章目录
- 一、 MongoDB相关概念
- 1、业务应用场景
- 2、MongoDB可应对“三高"需求。
- 3、什么时候选择MongoDB ?
- 二、MongoDB简介
- 1、体系结构
- 2、数据模型
- 三、MongoDB的特点
- 四、安装MongoDB
- 1、配置本地yum源
- 2、yum安装
- 3、修改配置文件
- 4、启动mongodb
- 5、进入MongoDB数据库
- 五、数据库简单的操作命令
- 1、选择和创建数据库
- 2、数据库的删除
- 3、集合的隐式创建与删除
- 4、插入数据
- 5、更改数据
- 六、导入导出
- 1、导出school库的info表:
- 2、查看导出文件:
- 3、导入:(导入一个新表info2,如果表不存在,会新建这个表)
- 4、进入数据库验证
- 5、基于条件的导出:(导出info表里id=10的记录)
- 七、备份恢复
- 八、克隆
- 1、克隆数据库
- 2、克隆集合(表)
一、 MongoDB相关概念
1、业务应用场景
传统的关系型数据库(如MySQL) ,在数据操作的"三高需求以及应对Web2.0的网站需求面前,显得力不从心。 解释:“三高”需求: ●High performance -对数据库并发读写的需求。 ●Huge Storage -对海量数据的高效率存储和访问的需求。 ●High Scalability & High Availability-对数据库的高可扩展性和高可用性的需求。
2、MongoDB可应对“三高"需求。
具体的应用场景如:
- 1)社交场景,使用MongoDB存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索实现附近的 人地点等功能。
- 2)游戏场景,使用MongoDB存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、 高敲率存储和访问。
- 3)物流场景,使用MongoDB存储订单信息,订单状态在运送过程中会不断更新,以MongoDB内嵌数组的形式 来存储,- -次查询就能将订单所有的变更读取出来。
- 4)物联网场景,使用MongoDB存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多 维度的分析。
- 5)视频直播,使用MongoDB存储用户信息、点赞互动信息等。
这些应用场景中,数据操作方面的共同特点是:
- (1)数据量大
- (2)写入操作频繁(读写都很频繁)
- (3)价值较低的数据,对事务性要求不高 对于这样的数据,我们更适合使用MongoDB来实现数据的存储。
3、什么时候选择MongoDB ?
在架构选型上,除了上述的三个特点外,如果你还犹豫是否要选择它?可以考虑以下的一些问题: 应用不需要事务及复杂join支持 新应用,需求会变,数据模型无法确定,想快速迭代开发 应用需要2000-3000以上的读写QPS (更高也可以) 应用需要TB甚至PB级别数据存储 应用发展迅速,需要能快速水平扩展 应用要求存储的数据不失 应用需要99.999%高可用 应用需要大量的地理位置查询、文本查询 如果上述有1个符合,可以考虑MongoDB, 2个及以上的符合,选择MongoDB绝不会后悔。
如果用MySQL呢? 相对MySQL,可以以更低的成本解决问题(包括学习、开发、运维等成本)
二、MongoDB简介
MongoDB是一个开源、 高性能、无模式的文档型数据库,当初的设计就是用于简化开发和方便扩展,是NoSQL数 据库产品中的一种。是最像关系型数据库(MySQL) 的非关系型数据库。 它支持的数据结构非常松散,是一种类似于JSON的格式叫BSON,所以它既可以存储比较复杂的数据类型,又相 当的灵活。 MongoDB中的记录是一个文档, 它是一个由字段和值对(field:value) 组成的数据结构。MongoDB文档类似于 JSON对象,即一个文档认为就是一个对象。字段的数据类型是字符型,它的值除了使用基本的一些类型外,还可 以包括其他文档、普通数组和文档数组。
1、体系结构
2、数据模型
MongoDB的最小存储单位就是文档(document)对象。文档(document)对象对应于关系型数据库的行。数据在 MongoDB中以BSON (Binary-JSON) 文档的格式存储在磁盘上。 BSON (Binary Serialized Document Format)是-种类json的一 种二进制形式的存储格式,简称Binary JSON。 BSON和JSON-样,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一-些数据类型,如Date和 BinData类型。
三、MongoDB的特点
MongoDB主要有如下特点:
- (1)高性能: MongoDB提供高性能的数据持久性。特别是, 对嵌入式数据模型的支持减少了数据库系统上的I/0活动。 弓支持更快的查询,并且可以包含来自嵌入式文档和数组的键。(文本索引解决搜索的需求、 TTL索引解决历史数据自动过期的需求、地理位置索弓可用于构建各种020应用) mmapv1、wiredtiger、 mongorocks (rocksdb) 、in-memory 等多引擎支持满足各种场景需求。 Gridfs解决文件存储的需求。
- (2)高可用性: . MongoDB的复制工具称为副本集(replica set),它可提供自动故障转移和数据冗余。
- (3)高扩展性: MongoDB提供了水平可扩展性作为其核心功能的一部分。 分片将数据分布在一组集群的机器上。(海量数据存储, 服务能力水平扩展) 从3.4开始,MongoDB支持基于片 键创建数据区域。在一个平衡的集群中, MongoDB将-个区域所覆盖的读写只 定向到该区域内的那些片。
- (4)丰富的查询支持: MongoDB支持丰富的查询语言,支持读和写操作(CRUD),比如数据聚合、文本搜索和地理空间查询等。
- (5) 其他特点:如无模式(动态模式)、 灵活的文档模型、
四、安装MongoDB
1、配置本地yum源
代码语言:javascript复制[root@mongodb yum.repos.d]# vim /etc/yum.repos.d/mongodb-org-4.0.repo
[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/
gpgcheck=0
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc
2、yum安装
代码语言:javascript复制yum list
[root@mongodb yum.repos.d]# yum -y install mongodb-org
[root@mongodb yum.repos.d]# whereis mongod <-----查看mongodb的配置文件位置
mongod: /usr/bin/mongod /etc/mongod.conf /usr/share/man/man1/mongod.1
3、修改配置文件
代码语言:javascript复制systemlog:
MongoDB发送所有日志输出的目标指定为文件
# #The path of the 1og file to which mongod or mongos should send a11 di agnostic logging
i nformation
destination: file ⊥
#mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
path: "/mongodb/sing1e/1og/mongod. log"
#当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。
logAppend: true
stor age:
#mongod实例存储其数据的目录。stor age . dbPath设置仅适用于mongod。
##The directory where the mongod instance stores its data.Default value is " /data/db".
dbPath: " /mongodb/sing1e/data/db"
journa1:
#启用或禁用持久性日志以确保数据文件保持有效和可恢复。当数据库发生宕机后,将数据库的状态恢复到之前
enabled: true
proces sManagement :
#启用在后台运行mongos或mongod进程的守护进程模式。
fork: true
net:
#服务实例绑定的IP,默认是localhost
bindIp: localhost ,0.0.0.0 '监听所有端口'
#bindIp
#绑定的端口,默认是27017
port: 27017
4、启动mongodb
代码语言:javascript复制[root@mongodb yum.repos.d]# systemctl start mongod
[root@mongodb yum.repos.d]# netstat -anpt | grep 27017
tcp 0 0 0.0.0.0:27017 0.0.0.0:* LISTEN 20265/mongod
5、进入MongoDB数据库
代码语言:javascript复制[root@mongodb ~]# mongo
MongoDB shell version v4.0.20
connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("760a7212-96f3-4d9b-b426-94b331ad2b10") }
MongoDB server version: 4.0.20
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
http://docs.mongodb.org/
Questions? Try the support group
http://groups.google.com/group/mongodb-user
Server has startup warnings:
……省略部分内容
> show dbs <-----查看数据库
admin 0.000GB
config 0.000GB
local 0.000GB
> exit <-----退出,或者按ctrl c退出
bye
[root@mongodb ~]#
五、数据库简单的操作命令
数据库名可以是满足以下条件的任意UTF-8字符串。
- 不能是空字符串(")。 .
- 不得含有’ (空格)、、$、1、和h0 (空字符)。
- 应全部小写。
- 最多64字节。
MongoDBmore的三个数据库
- admin:从权限的角度来看,这是"root’数据库。要是将一个用户添加到这个数据库, 这个用户自动继承所 有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务 器。
- local:这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
- config: 当Mongo用于分片设置时,config数据库在内部使用, 用于保存分片的相关信息。
1、选择和创建数据库
选择和创建数据库的语法格式: . use数据库名称 如果数据库不存在则自动创建,例如,以下语句创建spitdb数据库: 如果有的话直接就进入到这个数据库中
代码语言:javascript复制use articledb
查看有权限查看的所有的数据库命令
代码语言:javascript复制show dbs
或
代码语言:javascript复制show databases
注意:在MongoDB中,集合只有在内容插入后才会创建!就是说,创建集合(数据表)后要再插入一个文档(录),集合才会真正创建。 #查看当前正在使用的数据库命令 MongoDB中默认的数据库为test,如果你没有选择数据库,集合将存放在test数据库中。
2、数据库的删除
MongoDB删除数据库的语法格式如下:
代码语言:javascript复制> db.dropDatabase();
{ "ok" : 1 }
提示:主要用来删除已经持久化的数据库,而内存中还是有这个库的
3、集合的隐式创建与删除
基本语法格式: .
db.createCollection(“shang”) { “ok” : 1 }
参数说明:
查看当前库中的表: show tables命令 show collections 或 show tables
当向一个集合中插入一个文档的时候,如果集合不存在,则会自动创建集合。
提示:通常我们使用隐式创建文档即可。
集合删除语法格式如下: db. collection. drop() 或 db .集合.drop() 返回值 如果成功删除选定集合,则drop()方法返回true,否则返回false。
db.shang.drop() true
4、插入数据
要向info的集合(表)中插入一条测试数据:
db.createCollection(‘info’) //新建info表,如果不手动创建集合;向不存在的集合中第一次加入数据的时候,集合会被自动创建出来 { “ok” : 1 }
提示:
- info集合如果不存在,则会隐式创建
- mongo中的数字,默认情况下是double类型,如果要存整型,必须使用函数Numberlnt(整型数字),否则取出来就有问题了。 3)插入当前日期使用new Date() 4)插入的数据没有指定. _id,会自动生成主键值 5)如果某字段没值,可以赋值为null,或不写该字段。 执行后,如下,说明插入一个数据成功了。 Wr iteResult({ “nInserted” : 1 })
利用for循环批量添加用户
代码语言:javascript复制> for(var i=2;i<=100;i )db.info.insert({"id":1,"name":"jack" i})
> { "_id" : ObjectId("5f5b1f18a53aea026deda1d6"), "id" : 1, "name" : "jack2" }
{ "_id" : ObjectId("5f5b1f18a53aea026deda1d7"), "id" : 1, "name" : "jack3" }
{ "_id" : ObjectId("5f5b1f18a53aea026deda1d8"), "id" : 1, "name" : "jack4" }
{ "_id" : ObjectId("5f5b1f18a53aea026deda1d9"), "id" : 1, "name" : "jack5" }
{ "_id" : ObjectId("5f5b1f18a53aea026deda1da"), "id" : 1, "name" : "jack6" }
{ "_id" : ObjectId("5f5b1f18a53aea026deda1db"), "id" : 1, "name" : "jack7" }
查询name字段中jack10的信息
代码语言:javascript复制> db.info.findOne({name:"jack10"})
{
"_id" : ObjectId("5f5b3018c34c98ad91e8673c"),
"id" : 1,
"name" : "jack10"
}
>
查询字段的type类型
代码语言:javascript复制> a=db.info.findOne({name:"jack10"})
{
"_id" : ObjectId("5f5b3018c34c98ad91e8673c"),
"id" : 1,
"name" : "jack10"
}
> typeof(a.id)
number
>
> typeof(a.name)
string
这里你会发现每条文档会有一个叫_id的字段,这个相当于我们原来关系数据库中表的主键,当你在插入文档记录时没有指定该字段,MongoDB会自动创建,其类型是ObjectID类型。 如果我们在插入文档记录时指定该字段也可以,其类型可以是ObjectID类型,也可以是MongoDB支持的任意类 型。
5、更改数据
代码语言:javascript复制修改id=1的记录的name为tom
> db.info.update({"id":1},{$set:{"name":"tom"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
>db.info.find()
{ "_id" : ObjectId("5f56eafbbb50f14e91ed31e0"), "id" : 1, "name" : "tom", "score" : 90, "hobby" : [ "game", "music", "sport" ] }
六、导入导出
-d:指定数据库 -c:指定表 -o:指定导出文件 –file:指定从哪个文件导入
1、导出school库的info表:
代码语言:javascript复制[root@mongodb ~]# mongoexport -d school -c info -o /opt/school.json
2020-09-08T11:56:53.466 0800 connected to: localhost
2020-09-08T11:56:53.467 0800 exported 1 record
2、查看导出文件:
代码语言:javascript复制[root@mongodb ~]# vim /opt/school.json
{"_id":{"$oid":"5f56eafbbb50f14e91ed31e0"},"id":1.0,"name":"tom","score":90.0,"hobby":["game","music","sport"]}
3、导入:(导入一个新表info2,如果表不存在,会新建这个表)
代码语言:javascript复制[root@mongodb ~]# mongoimport -d school -c info2 --file /opt/school.json
2020-09-08T11:58:46.720 0800 connected to: localhost
2020-09-08T11:58:46.732 0800 imported 1 document
4、进入数据库验证
代码语言:javascript复制[root@mongodb ~]# mongo
> use school
switched to db school
> show tables
info
info2
> db.info2.find()
{ "_id" : ObjectId("5f56eafbbb50f14e91ed31e0"), "id" : 1, "name" : "tom", "score" : 90, "hobby" : [ "game", "music", "sport" ] }
5、基于条件的导出:(导出info表里id=10的记录)
代码语言:javascript复制[root@mongodb ~]# mongoexport -d school -c info -q '{"id":{"$eq":10}}' -o /opt/top10.json
2020-09-08T12:12:26.122 0800 connected to: localhost
2020-09-08T12:12:26.123 0800 exported 1 record
查询条件操作符: (=) 等于 - eq (>) 大于 - lt (>=) 大于等于 -
查看导出文件:
代码语言:javascript复制[root@mongodb ~]# vim /opt/top10.json
{"_id":{"$oid":"5f570266a1451cb5e42060cc"},"id":10.0,"name":"jack10"}
七、备份恢复
备份命令mongodump 恢复命令mongorestore
需要在shell命令行操作
代码语言:javascript复制[root@mongodb ~]# mkdir /bak //新建备份目录
[root@mongodb ~]# mongodump -d school -o /bak //备份到/bak目录
2020-09-08T12:15:12.357 0800 writing school.info to
2020-09-08T12:15:12.357 0800 writing school.info2 to
2020-09-08T12:15:12.359 0800 done dumping school.info2 (1 document)
2020-09-08T12:15:12.359 0800 done dumping school.info (100 documents)
[root@mongodb ~]# ls /bak/
school
[root@mongodb ~]# cd /bak/school
[root@mongodb school]# ls
info2.bson info2.metadata.json info.bson info.metadata.json
代码语言:javascript复制从备份目录恢复数据库,数据库不存在的话会自动创建
[root@mongodb school]# mongorestore -d school2 --dir=/bak/school
2020-09-08T12:17:39.469 0800 the --db and --collection args should only be used when restoring from a BSON file. Other uses are deprecated and will not exist in the future; use --nsInclude instead
2020-09-08T12:17:39.470 0800 building a list of collections to restore from /bak/school dir
2020-09-08T12:17:39.470 0800 reading metadata for school2.info2 from /bak/school/info2.metadata.json
2020-09-08T12:17:39.471 0800 reading metadata for school2.info from /bak/school/info.metadata.json
2020-09-08T12:17:39.477 0800 restoring school2.info2 from /bak/school/info2.bson
2020-09-08T12:17:39.483 0800 restoring school2.info from /bak/school/info.bson
2020-09-08T12:17:39.484 0800 no indexes to restore
2020-09-08T12:17:39.484 0800 finished restoring school2.info2 (1 document)
2020-09-08T12:17:39.487 0800 no indexes to restore
2020-09-08T12:17:39.487 0800 finished restoring school2.info (100 documents)
2020-09-08T12:17:39.487 0800 done
[root@mongodb school]#
//还原指定数据库,这个数据库可以是一个新的,不存在的,它会自己创建
进入数据库验证
代码语言:javascript复制> show dbs;
admin 0.000GB
config 0.000GB
local 0.000GB
school 0.000GB
school2 0.000GB
> use school2
switched to db school2
> show tables
info
info2
八、克隆
1、克隆数据库
db.copyDatabase在4.0以后已经被弃用,但是依然可以成功
代码语言:javascript复制> db.copyDatabase("school","share") //复制数据库,新库叫share
WARNING: db.copyDatabase is deprecated. See http://dochub.mongodb.org/core/copydb-clone-deprecation
{
"note" : "Support for the copydb command has been deprecated. See http://dochub.mongodb.org/core/copydb-clone-deprecation",
"ok" : 1
}
> show dbs;
admin 0.000GB
config 0.000GB
local 0.000GB
school 0.000GB
school2 0.000GB
share 0.000GB
2、克隆集合(表)
要先创建多实例再为多实例创建数据目录
代码语言:javascript复制> use school
switched to db school
> show tables
info
> db.info.drop()
true
> db.runCommand({"cloneCollection":"school.info","from":"192.168.110.133:27017"})
{ "ok" : 1 }
> show tables
info