mongo 概念介绍以及数据库操作
Posted zy9011
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mongo 概念介绍以及数据库操作相关的知识,希望对你有一定的参考价值。
MongoDB适用场景
1)网站数据:MongoDB 非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性
2)缓存:由于性能很高,MongoDB 也适合作为信息基础设施的缓存层。在系统重启之后,由 MongoDB 搭建的持久化缓存层可以避免下层的数据源过载
3)大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储
4)高伸缩性的场景:MongoDB 非常适合由数十或数百台服务器组成的数据库。MongoDB的路线图中已经包含对 MapReduce 引擎的内置支持
5)用于对象及 JSON 数据的存储:MongoDB 的 BSON 数据格式非常适合文档化格式的存储及查询
MongoDB使用场景
- 我的数据量是有亿万级或者需要不断扩容
- 需要2000-3000以上的读写每秒
- 新应用,需求会变,数据模型无法确定
- 我需要整合多个外部数据源
- 我的系统需要99.999%高可用
- 我的系统需要大量的地理位置查询
- 我的系统需要提供最小的latency
- 我要管理的主要数据对象 <10
MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。
mongo --port 27017
mongo 的默认端口为27017,数据传输协议 TCP,数据库目录 /data/db
1. mongo 使用shell 的常用命令
1. show dbs #显示已有的数据库列表
2. show collections # 已有集合列表
3. show users # 已有用户列表
4. use dbname # 切换到某个数据库,若系统没有会延迟创建该数据库
5. db.collectionName.insert("x":"y") # 插入一个文档,若不存在这个collection 会默认创建
6. db.collectionName.find() # 查看集合数据
7. db.dropDatabase() # 删除某个数据库
8. db.collectionName.drop()# 删除某个集合
9. Help查看命令提示
> db.help();
>db.collectionName.help();
>db.collectionName.find().help();
> rs.help();
10.从指定的机器上复制指定数据库数据到某个数据库
>db.copyDatabase("mydb", "temp", "127.0.0.1");#将本机的mydb的数据复制到temp数据库中
11. db.repairDatabase() # 修复当前数据库
12. 查看当前使用的数据库
> db
> db.getName()
13. db.stats() # 显示当前db 的状态
14. db.version() # 当前db版本
15. db.getMongo() # 查看当前db的链接机器地址
16. db.createUser(user:"zy",pwd:"123456",roles:[role:"readWrite",db:"test"]) # 创建用户
17. db.auth("root","123")#输入账号密码
简单的shell 命令使用如下图:
由于mongo和我们常用的关系型数据库不同,下图列出了 RDBMS 与 MongoDB 对应的术语:
mongo 命名的规则
1.库
库名全部小写,禁止使用任何_以外的特殊字符,禁止使用数字打头的库名,如:123_abc
库以文件夹的形式存在,使用特殊字符或其它不规范的命名方式会导致命名混乱
数据库名最多为64字符
在创建新的库前应尽量评估该库的体积、QPS等,提前与DBA讨论是应该新建一个库还是专门为该库创建一个新的集群
- 不能为空字符串(” “)
- 不能以$开头
- 不得含有’ '(空格)、.、$、/、\\和\\0 (空字符)
- 数据库名区分大小写(建议数据库名全部使用小写)
- 数据库名最长为64个字节
- 不要与系统保留的数据库名相同,这写数据库包括:admin,local,config等
有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。
- admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
- local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
- config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
2.集合
集合名全部小写,禁止使用任何_以外的特殊字符,禁止使用数字打头的集合名,如:123_abc,禁止system打头
system是系统集合前缀
集合名称最多为64字符
为了避免库级锁带来的问题,应尽量对写入较大的集合使用“单库单集合”的结构,所以对于新增业务应尽量创建新库,而不是在现有库中创建新集合
一个库中写入较大的集合会影响其它集合的读写性能
如果评估单集合数据量较大,可以将一个大表拆分为多个小表,然后将每一个小表存放在独立的库中,由于MongoDB是库级锁,因此这样做可以大幅减少并发写入带来的锁争用问题
- 集合名不能为空字符串(” “)
- 不能包含\\0或空字符,这个字符表示键的结尾
- 集合名不能以”system.”开头,此前缀是系统本身保留的
- 集合名不能包含$字符(注:可包含 . 点号)
集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。
3.文档
文档是一组键值(key-value)对(即BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。
需要注意的是:
- 文档中的键/值对是有序的。
- 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
- MongoDB区分类型和大小写。
- MongoDB的文档不能有重复的键。
- 文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。
文档键命名规范:
- 键不能含有\\0 (空字符)。这个字符用来表示键的结尾。
- 和$有特别的意义,只有在特定环境下才能使用。
- 以下划线"_"开头的键是保留的(不是严格要求的)。
mongo 的数据工具
- 数据库组件: mongod 、mongos 、mongo
mongod : 用来启动mongo 服务
mongos: 数据分片
mongo: 进入mongo 的shell 工具
数据库自带工具使用
一 、mongodump 备份导出数据库
- 1.常用命令格式
mongodump -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表 -o 文件存放路径
参数说明:
-h 指明数据库宿主机的IP
–port 指明数据库的端口
-u 指明数据库的用户名
-p 指明数据库的密码
-d 指明数据库的名字
-c 指明collection的名字
-o 指明到要导出的文件名
-q 指明导出数据的过滤条件
命令如下图:
- 2.导出所有数据库
mongodump -o /data/mongobak/
- 3.导出指定数据库
mongodump -d SERVERLOG -o /data/mongobak/SERVERLOG.bak/
二 、mongorestore恢复数据库
- 1.常用命令格式
mongorestore -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 --drop 文件存在路径
--drop:先删除所有的记录,然后恢复.
- 2.恢复所有数据库到mongodb中
mongorestore /data/mongobak/ #所有库的备份路径
- 3.恢复指定的数据库
mongorestore -d SERVERLOG /data/mongobak/SERVERLOG.bak/SERVERLOG/ #SERVERLOG这个数据库的备份路径
mongorestore -d SERVERLOG_new /data/mongobak/SERVERLOG.bak/SERVERLOG/ #将SERVERLOG备份数据还原到SERVERLOG_new数据库中
三、 mongoexport导出(表或者表中部分字段)
- 1.常用命令格式
mongoexport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 -f 字段 -q 条件导出 --csv -o 文件名
参数重点说明:
-f 导出指定字段,以逗号分割,-f uid,name,age导出uid,name,age这三个字段
-q 可以根据查询条件导出,-q ‘ “uid” : “100” ’ 导出uid为100的数据
–csv 表示导出的文件格式为csv的。这个比较有用,因为大部分的关系型数据库都是支持csv,在这里有共同点
- 2.导出整张表
mongoexport -d SERVERLOG -c users -o /data/mongobak/SERVERLOG.bak/users.dat
- 3.导出表中部分字段
mongoexport -d SERVERLOG -c users --csv -f name,age -o /data/mongobak/SERVERLOG.bak/users.csv
- 4.根据条件导出数据
mongoexport -d SERVERLOG -c users -q 'uid:$gt:1' -o /data/mongobak/SERVERLOG.bak/users.json
四、 mongoimport导入(表或者表中部分字段)
- 1.常用命令格式
恢复整表导出的非csv文件
mongoimport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 --upsert --drop 文件名
--upsert:插入或者更新现有数据
恢复部分字段的导出文件
mongoimport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 --upsertFields 字段 --drop 文件名
--upsertFields:更新部分的查询字段,必须为索引,以逗号分隔.
恢复导出的csv文件
mongoimport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 --type 类型 --headerline --upsert --drop 文件名
--type:导入的文件类型(默认json)
- 2.恢复导出的表数据
mongoimport -d SERVERLOG -c users --upsert /data/mongobak/SERVERLOG.bak/users.dat
- 3.部分字段的表数据导入
mongoimport -d SERVERLOG -c users --upsertFields uid,name,age /data/mongobak/SERVERLOG.bak/users.dat
- 4.恢复csv文件
mongoimport -d SERVERLOG -c users --type csv --headerline --file /data/mongobak/SERVERLOG.bak/users.csv
--file:需要导入的文件
查看.bson 文件
- bsondump //db.bson
如下图:
以上是关于mongo 概念介绍以及数据库操作的主要内容,如果未能解决你的问题,请参考以下文章