MongoDB_1_概念 数据类型
数据存储阶段
文件管理阶段(.txt .doc .xls)
优点:
- 数据便于长期保存
- 数据可以大量存储
- 使用简单
缺点: - 数据的存储结构比较随意
- 数据的查找修改效率较低
- 不方便扩展和程序调用
数据库管理阶段
优点:
- 数据格式化存储,便于操作
- 降低了数据的冗余,提高了增删改查的效率
- 方便程序调用和扩展
缺点: - 使用上往往需要特定的语句或操作,相对复杂
数据库概念:
**数据:**能够输入到计算机中并被识别处理的信息集合。
**数据结构:**研究一个数据集合中,数据之间关系的学科。
**数据库:**按照数据结构,存储管理数据的仓库。
**数据库:**按照数据结构,存储管理数据的仓库。数据库是在数据库管理系统管理和控制下,在一定介质上存储的数据集合。
**数据库管理系统:**数据库管理软件,用于维护建立数据库。
**数据库系统:**由数据库和数据库管理系统等开发工具组成的集合。
关系型数据库
采用关系模型(二维表)来组织数据结构的数据库。
eg.: Oracle DB2 SQLServer Mysql Sqlite
优点:
- 容易理解,逻辑类似常见的表格
- 使用方便,都使用sql语句进行数据操作,sql语句很成熟
- 数据的一致性高,冗余低,完整性好
- 相对非关系型,技术成熟,可以使用表关联等复杂操作
缺点: - 每次数据操作都需要sql解析,消耗较大
- 关系型数据库内部操作往往都需要加锁,也影响了处理速度
- 不能很好的处理海量数据的高并发需求,读写能力差
- 由于数据的一致性等规定,灵活性也不高
非关系型数据库 (NoSql --> Not Only Sql)
优点:
- 并发能力强,读写速度快,可以更好应对海量数据并发需要
- 普遍比较灵活,容易扩展,弱化了数据的一致性
缺点: - 通用性差,没有像sql那样一致的语句操作
- 灵活性强会导致一定的操作混乱
- 技术成熟度比关系型数据库要差
NoSql的使用情况
- 对数据一致性要求较低
- 应对数据提高并发存储的可能性较大
- 比较容易建立非关系型数据库模型
NoSql分类
- 键值型数据库:Redis
- 列存储数据库:HBase
- 文档型数据库:MongoDB
- 图形数据库
MongoDB数据库 (非关系型,文档型数据库)
特点:
- 由c++编写的数据库管理系统
- 支持丰富的增删改查操作
- 丰富的存储类型,技术相对成熟
- 支持众多的编辑语言操作
- 使用方便,便于扩展和部署
MongoDB的安装
linux: sudo apt -get install mongodb
安装位置:/var/lib/mongodb
配置文件位置:/etc/mongodb.conf
命令集位置:/usr/bin
手动安装:
- www.mongodb.com 下载对应系统的安装包
- 将压缩包解压到一个目录下,/usr/local
- 进入解压后的目录,里面的bin目录即命令集所在目录,将这个目录(bin)路径加入环境变量即可。
eg.: 将/opt/mongodb/bin/ 加入环境变量,终端执行
PATH=$PATH:/opt/mongodb/bin
export PATH
- 如果不想每次启动都执行则将以上两句写入主目录下的 .bashrc中
MongoDB 命令
1.设置数据库的存储位置:momgod --dbpath 目录
eg.:将database目录设置为数据
mongod --dbpath database
2.设置数据连接接口:mongod --port port
(如果不设置,则默认端口为 27017)
3.启动MongoDB操作界面(mongo sbell):mongo
退出界面:quit( ) 或者 ctrl+c
MongoDB数据库结构
键值对 >> 文档 >> 集合 >> 数据库
ID | name | age |
---|---|---|
1 | lily | 18 |
2 | lucy | 17 |
mysql | mongodb | 含义 |
---|---|---|
database | database | 数据库 |
table | collection | 表/集合 |
colum | field | 字段/域 |
row | document | 记录/文档 |
index | index | 索引 |
MongoDB操作命令
创建数据库:
use database
eg.: 创建一个叫stu的数据库
use stu
use 实际是选择使用哪个数据库,当这个数据库不存在时会自动创建这个数据库。
使用use创建数据库,并不会马上建立起来,而是需要真正插入数据时才会产生。
查看系统中数据库:
show dbs
数据库命名规则:
- (默认)使用utf-8字符(支持中文)
- 不能含有 空格 . / \ '\0’字符
- 长度不超过64字节
- 不要和系统数据库重名
全局变量db:
db变量代表当期正在使用的数据库 ,如果不选择任何数据库,db为test
删除数据库:
db.dropDatabase( )
# 删除db代表的数据库
数据库的备份和恢复:
备份数据库:
mongodump -h dbhost -d dbname -o dir
说明:dbhost表示主机地址;dbname表示要备份的库名;dir表示备份的目标目录
eg.: mongod -h 127.0.0.1 -d stu -o .
备份本机中(127.0.0.1)的(stu数据库)到(当前目录)
数据库文件恢复:
mongorestore -h dbhost:port -d dbname path
说明:dbhost:port表示主机地址:默认端口;dbname表示要恢复到的目标库名;path表示被恢复文件的路径
eg.: mongorestore -h 127.0.0.1:27017 -d student ./stu
获取数据 到本机 的student数据库中, 从stu
数据库的监控命令:
mongostat: 查看数据库运行状态
insert query update delete: 每秒执行增删改查的次数
command: 每秒执行mongo命令的次数
flushes: 和磁盘交互情况
vsize res: 使用虚拟内存和物理内存情况
time: 运行时间
mongotop: 检测每个数据库中数据表的读写情况
ns: 数据集合
totol: 总时长
read: 读时长
write: 写时长
关于集合(collection)的操作
创建集合:
方法1: db.createCollection(collection集合名)
eg.: db.createCollection(‘class1’) #创建集合class1
方法2: 当插入数据时,需要指定集合,如果集合不存在,则自动创建
eg.: db.class2.insert({‘name’:‘阿宝’,‘age’:‘35’,‘sex’:‘m’})
插入数据时class2不存在则自动创建这个集合
查看数据库中集合:
show collections 或者 show tables**
集合的命名规则:
- 使用utf-8字符
- 不能含有 \0 字符
- 不要以system.开头,这是系统集合默认开头
- 不要和关键字重复
删除集合:
db.collection.drop( )
eg.: db.class.drop( ) #删除数据库中class集合
集合重命名:
db.collection.renameCollection('newname')
eg.: db.class.renameCollection(‘class0’)
将集合class重命名为class0
文档
什么是文档?
- 文档是mongodb数据库中基本的数据组成,形式类似于文档
- 文档由键值对构成,每个键值对表达一个数据项
- mongodn文档属于bson类型数据
- 文档中的键值对是有序的
键:即文档的‘域’,表达‘值是什么内容’。
键的命名规则:
- 使用utf-8字符串
- 不能使用\0
- 一个文档中的键不能重复
值:即数据库存储的数据
类型 | 值 |
---|---|
数字 | 整数 小数 |
布尔类型 | true false |
Array | 数组 |
Date | 日期时间 |
Timestamp | 时间戳(时间结点) |
String | 字符串 |
Binary data | 二进制字符串 |
Null | 空 null |
Object | 内部文档(对象) |
regex | 正则表达式 |
code | 代码 |
ObjectID | ObjectID字典 |
ObjectID类型
"_id" : ObjectId("5bd13bb108b2199bcf4586e6")
_id: 当插入mongodb文档时,会自动生成_id域作为主键id.
值: ObjectId数据,为了和其他的值不重复,
(24位16进制编码:8位文档创建时间,6位机器ID,4位进程ID,6位计数器)。
集合中的文档
- 每个集合中的文档格式可以不同
- 一个集合当中存储的数据尽量体现相同的内容
- 文档的表达,层次尽量不要太多
插入文档**:
插入单个文档:
db.collection.insertOne( )
功能:插入一条文档
参数:要插入的文档
eg.: db.class0.insertOne({‘name’:‘Lucy’,‘age’:‘17’,‘sex’:‘W’})
向class0中插入一个文档{… }
db.class.find( ): 查看插入结果(文档)
数据操作时,键可以不加引号
可以自己添加_id域,但是_id域的值不能重复
一个集合中插入的文档是有序的
插入多条文档:
db.collection.insertMany([{ },{ },{ }...])
功能:插入多个文档
参数:数组中包含多个文档
eg.: db.class2.insertMany([{name:‘傻屌’,age:30,sex:‘w’},{name:‘阿花’,age:‘18’,sex:‘w’}])
插入文档 >:db.collection.insert( )
功能:等于 insertOne + insertMany
save插入文档 >:db.collection.save( )
功能:插入文档,用法与insert相同
参数:与insert相同,可以插入一条或多条文档
eg.: db.class1.save([{name:‘小明’,age:22,sex:‘M’},{name:‘小张’,age:22,sex:‘M’}])
如果要插入的文档_id已经存在,则会替换掉原有文档的内容
eg.: db.class0.save({"_id":1,“name”:“Hanna”,“age”:28,“sex”:“W”})
获取集合对象
db.getCollection(collection_name)
eg.: db.getCollection(‘class0’) <==> db.class0
查找操作:
mysql: select ... from table where ...
mongodb: db.collection.find(query, field)
查找集合中所有内容(文档):
db.collection.find( )
# 类似于select * from table
find(query, field)
功能:查找所有符合条件的文档
参数 query: 表示【筛选条件】,是一个键值对文档,默认表示查找所有内容。
eg.: db.class0.find({age:17}) # 筛选所有年龄为17的文档
参数 field:
表示要【查找的域】,是一个键值对文档,用0表示不查找某个域,1表示查找某个域。
eg.: db.class0.find({},{_id:0,name:1}) # 不查找_id,查找name
当某个普通域设置为 0 时,表示该域不查找,其他的域的域查找; 如果设置为 1 则表示查找,其他的不查找.
对于查找的域,在表达式值0和1不能在参数中同时出现。
_id域比较特殊,如果不想查找必须明确 _id:0。
findOne(query, field)
功能:查找第一条符合条件的文档
参数:使用方法同find
eg.: db.class0.findOne({age:17},{_id:0}) # 筛选所有年龄为17的第一条文档