MongoDB数据库
1. 数据库(Database)
- 按照数据结构来组织、管理和存储数据的仓库
2. 数据库分类
- 关系型数据库(sql)
- 代表: Access,mySql,SqlServer,oracle,db2
- 非关系型数据库(NoSql)
- 代表: MongoDB,Redis,HBase,CouchDB
3. 两个类型数据库的区别
- 是否有表
- 非关系型数据库的优势
- 性能
- NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL层的解析,所以性能非常高
- 可扩展性
- 同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展
- 性能
- 关系型数据库的优势
- 复杂查询
- 可以用SQL语句方便的在多个表之间做非常复杂的数据查询
- 事务支持
- 使得对于安全性能很高的数据访问要求得以实现
- 复杂查询
4. 两个数据库构成
- SQL
- 数据库 - 表 - 行
- NoSql(非关系型的数据库)
- 数据库 - 集合 - 文档
- 文档: 一个bson的键值对文档
- 用于超大规模数据的存储
- 数据库 - 集合 - 文档
5. bson(Binary JSON)
- bson是json的超集
- bson比json多了二进制等数据类型
- 支持Date和BinData类型
- 支持内嵌的文档对象和数组对象
- BSON有三个特点:轻量性、可遍历性、高效性
- MongoDB的存储数据类型就是bson
6. MongoDB的安装和配置
- 官网
https://www.mongodb.com/
- Robo 3T可视化工具安装
- 设置环境变量
- 创建文件夹
- 在d盘建立一个文件夹mongodb,并且建立子目录 db 和 log
- 在log目录下建立一个文件MongoDB.log ,后缀为.log
- d:\mongodb\db、d:\mongodb\log, 分别用来存放数据库文件和数据库日志文件
- 把mongodb文件夹的只读属性去掉
- 启动MongoDB
- 以管理员身份运行cmd.exe,进入dos命令界面,执行下列命令
mongod --storageEngine mmapv1 --dbpath "d:\mongodb\db" --logpath "d:\mongodb\log\MongoDB.log"
- 原来的cmd窗口不关闭,以管理员身份再开一个cmd窗口,输入mongo或者mongo.exe
- 以管理员身份运行cmd.exe,进入dos命令界面,执行下列命令
- 输入exit或者ctrl+C可退出
- 将MongoDB安装为windows服务
- 以管理员身份运行cmd,进入bin文件夹,执行下列命令
mongod --storageEngine mmapv1 --dbpath "d:\mongodb\db" --logpath "d:\mongodb\log\MongoDB.log" --install --serviceName "MongoDB"
- 启动mongodb服务
NET START MongoDB
- 测试连接
mongo
- 以管理员身份运行cmd,进入bin文件夹,执行下列命令
- 关闭服务和删除进程
- 先 ctrl+c,关闭服务net stop MongoDB
7. MongoDB特点
- 分布式存储,由 C++ 语言编写
- 是非关系型数据库当中功能最丰富,最像关系型数据库的
- 高性能、易部署、易使用,存储数据非常方便
- 面向集合存储,易存储对象类型的数据
- 模式自由
- 支持动态查询
- 支持完全索引,包含内部对象
- 支持查询
- 支持复制和故障恢复
- 使用高效的二进制数据存储,包括大型对象(如视频等)
- 自动处理碎片,以支持云计算层次的扩展性
- 支持RUBY,PYTHON,JAVA,C++,PHP等多种语言
- 文件存储格式为BSON(一种JSON的扩展)
8. MongoDB基本操作【 CURD 】
- 查看帮助
$ Help
- 显示数据库列表
$ show dbs
- 创建(切换)数据库
$ use dbname
- 显示数据库中的集合
$ show collections
- 增加
- save
$ db.colName.save({})
- insert
$ db.colName.insert({})
- 区别: save对同一数据(主键已存在)是修改,insert是报错
- _id是主键,主键是每条数据的唯一标识,不能重复
- save
- 删除
- remove
- 清空集合
$ db.colName.remove({})
- 删除集合中一条
$ db.colName.remove({name: "node.js"})
- 删除集合
$ db.colName.drop()
$ db.runCommand({"drop":"colName"})
- 删除数据库
$ db.runCommand({ dropDatabase: 1})
- 修改
- update
- db.colName.update( 匹配条件,修改内容(主键不能修改),是否全匹配,是否全修改)
$ db.colName.update({name: "node.js"},{$set: { age: 50}},true,true)
- update
- 查询
- find
- db.colName.find({}) 查询集合中的所有文档
- db.colName.find({},{}) 将第二个参数中想显示的显示出来
$ db.colName.find({},{ _id: 0,name: "node.js",age: 1})
db.users.find().pretty()
- 格式化查询到的数据
db.colName.find({}).sort({age: 1})
- 根据年龄做排序 1是升序 -1 是降序
db.colName.find({}).limit()
- 将查询出来的数据做一个截取
> $gt
< $lt
>= $gte
<= $lte
- find
9. MongoDB高级命令
- 条件查找
db.collection.find({ "key" : value })
- 查找key = value的数据
db.collection.find({ "key" : { $gt: value } })
- 查找key > value的数据
db.collection.find({ "key" : { $lt: value } })
- 查找key < value的数据
db.collection.find({ "key" : { $gte: value } })
- 查找key >= value的数据
db.collection.find({ "key" : { $lte: value } })
- 查找key <= value的数据
db.collection.find({ "key" : { $gt: value1 , $lt: value2 } })
- 查找value1 < key <value2的数据
db.collection.find({ "key" : { $ne: value } })
- 查找key <> value的数据
db.collection.find({ "key" : { $mod : [ 10 , 1 ] } })
- 取模运算,条件相当于key % 10 == 1 即key除以10余数为1的
db.collection.find({ "key" : { $in: [ 1, 2, 3 ] } })
- 属于,条件相当于key等于[ 1, 2, 3 ]中任何一个
db.collection.find({ "key" : { $nin: [ 1, 2, 3 ] } })
- 不属于,条件相当于key的值不属于[ 1, 2, 3 ]中任何一个
db.collection.find({ "key" : { $size: 1 } })
- $size 数量、尺寸,条件相当于key对应的值的数量是1(值必须是数组)
db.collection.find({ "key" : { $exists : true|false } })
- $exists 字段存在,true返回存在字段key的数据,false返回不存在字段key的数据
db.collection.find({ $or : [{a : 1}, {b : 2} ] })
- 符合两个条件中任意一个的数据。$or语法表示或的意思。 (注意:MongoDB 1.5.3后版本可用),符合条件a=1的或者符合条件b=2的数据都会查询出来
db.collection.find({ "key.subkey" :value })
- 内嵌对象中的值匹配,注意:"key.subkey"必须加引号
db.singer.insert({"name":"test2",score:{"yy":80,"sx":79,"wy":95}})
- 插入一条测试数据,此数据的score对应的值是一个对象
- 排序
db.collection.find().sort({ "key1" : -1 ,"key2" : 1 })
- 1代表升序,-1代表降序
- 索引
- MongoDB使用 ensureIndex() 方法来创建索引
- ensureIndex()方法基本语法格式:
>db.COLLECTION_NAME.ensureIndex({KEY:1})
- 1为指定按升序创建索引,-1按降序来创建索引
- ensureIndex() 方法中你也可以设置使用多个字段创建索引(关系型数据库中称作复合索引)
> db.col.ensureIndex({"title":1,"description":-1})
- 其它
db.collection.find().limit(5)
- 控制返回结果数量,如果参数是0,则没有约束,limit()将不起作用
db.collection.find().skip(5)
- 控制返回结果跳过多少数量,如果参数是0,则当作没有约束,skip()将不起作用,或者说跳过了0条
db.collection.find().skip(5).limit(5)
- 可用来做分页,跳过5条数据再取5条数据
db.collection.find().count()
- count()返回结果集的条数
db.collection.find().skip(5).limit(5).count(true)
- 在加入skip()和limit()这两个操作时,要获得实际返回的结果数,需要一个参数true,否则返回的是符合查询条件的结果总数
db.collection.find({"name":/ab/})
- 模糊查询
10. 使用可视化工具