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 概念介绍以及数据库操作的主要内容,如果未能解决你的问题,请参考以下文章

mongo 概念介绍以及数据库操作

02 MongoDB数据类型重要概念以及shell常用指令

mongoDB适用啥场合呢?

k8s弹性伸缩概念以及测试用例

mongoDB应用篇-mongo聚合查询

大数据概念及Hadoop介绍