传统的关系型数据库(如MySQL) ,在数据操作的"三高需求以及应对Web2.0的网站需求面前,显得力不从心。 解释:“三高”需求: ●High performance -对数据库并发读写的需求。 ●Huge Storage -对海量数据的高效率存储和访问的需求。 ●High Scalability & High Availability-对数据库的高可扩展性和高可用性的需求。
具体的应用场景如:
这些应用场景中,数据操作方面的共同特点是:
在架构选型上,除了上述的三个特点外,如果你还犹豫是否要选择它?可以考虑以下的一些问题: 应用不需要事务及复杂join支持 新应用,需求会变,数据模型无法确定,想快速迭代开发 应用需要2000-3000以上的读写QPS (更高也可以) 应用需要TB甚至PB级别数据存储 应用发展迅速,需要能快速水平扩展 应用要求存储的数据不失 应用需要99.999%高可用 应用需要大量的地理位置查询、文本查询 如果上述有1个符合,可以考虑MongoDB, 2个及以上的符合,选择MongoDB绝不会后悔。
如果用MySQL呢? 相对MySQL,可以以更低的成本解决问题(包括学习、开发、运维等成本)
MongoDB是一个开源、 高性能、无模式的文档型数据库,当初的设计就是用于简化开发和方便扩展,是NoSQL数 据库产品中的一种。是最像关系型数据库(MySQL) 的非关系型数据库。 它支持的数据结构非常松散,是一种类似于JSON的格式叫BSON,所以它既可以存储比较复杂的数据类型,又相 当的灵活。 MongoDB中的记录是一个文档, 它是一个由字段和值对(field:value) 组成的数据结构。MongoDB文档类似于 JSON对象,即一个文档认为就是一个对象。字段的数据类型是字符型,它的值除了使用基本的一些类型外,还可 以包括其他文档、普通数组和文档数组。
MongoDB的最小存储单位就是文档(document)对象。文档(document)对象对应于关系型数据库的行。数据在 MongoDB中以BSON (Binary-JSON) 文档的格式存储在磁盘上。 BSON (Binary Serialized Document Format)是-种类json的一 种二进制形式的存储格式,简称Binary JSON。 BSON和JSON-样,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一-些数据类型,如Date和 BinData类型。
MongoDB主要有如下特点:
[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
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
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
[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
[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字符串。
MongoDBmore的三个数据库
选择和创建数据库的语法格式: . use数据库名称 如果数据库不存在则自动创建,例如,以下语句创建spitdb数据库: 如果有的话直接就进入到这个数据库中
use articledb
查看有权限查看的所有的数据库命令
show dbs
或
show databases
注意:在MongoDB中,集合只有在内容插入后才会创建!就是说,创建集合(数据表)后要再插入一个文档(录),集合才会真正创建。 #查看当前正在使用的数据库命令 MongoDB中默认的数据库为test,如果你没有选择数据库,集合将存放在test数据库中。
MongoDB删除数据库的语法格式如下:
> db.dropDatabase();
{ "ok" : 1 }
提示:主要用来删除已经持久化的数据库,而内存中还是有这个库的
基本语法格式: .
db.createCollection(“shang”) { “ok” : 1 }
参数说明:
查看当前库中的表: show tables命令 show collections 或 show tables
当向一个集合中插入一个文档的时候,如果集合不存在,则会自动创建集合。
提示:通常我们使用隐式创建文档即可。
集合删除语法格式如下: db. collection. drop() 或 db .集合.drop() 返回值 如果成功删除选定集合,则drop()方法返回true,否则返回false。
db.shang.drop() true
要向info的集合(表)中插入一条测试数据:
db.createCollection(‘info’) //新建info表,如果不手动创建集合;向不存在的集合中第一次加入数据的时候,集合会被自动创建出来 { “ok” : 1 }
提示:
利用for循环批量添加用户
> 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的信息
> db.info.findOne({name:"jack10"})
{
"_id" : ObjectId("5f5b3018c34c98ad91e8673c"),
"id" : 1,
"name" : "jack10"
}
>
查询字段的type类型
> 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支持的任意类 型。
修改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:指定从哪个文件导入
[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
[root@mongodb ~]# vim /opt/school.json
{"_id":{"$oid":"5f56eafbbb50f14e91ed31e0"},"id":1.0,"name":"tom","score":90.0,"hobby":["game","music","sport"]}
[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
[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" ] }
[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 (>=) 大于等于 -
查看导出文件:
[root@mongodb ~]# vim /opt/top10.json
{"_id":{"$oid":"5f570266a1451cb5e42060cc"},"id":10.0,"name":"jack10"}
备份命令mongodump 恢复命令mongorestore
需要在shell命令行操作
[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
从备份目录恢复数据库,数据库不存在的话会自动创建
[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]#
//还原指定数据库,这个数据库可以是一个新的,不存在的,它会自己创建
进入数据库验证
> 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
db.copyDatabase在4.0以后已经被弃用,但是依然可以成功
> 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
要先创建多实例再为多实例创建数据目录
> 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