目录
NoSql 数据库之一 — mongoDB
- NoSQL: not only SQL 不仅仅是 SQL
- 是一类数据库,是非关系型数据库,而关系型数据库有(Oracle 、Mysql、…)
- 是面向对象的数据库
- 结构不固定性,每条记录可以有不一样的键,即灵活的数据模型
- 扩展灵活(水平扩展)-- 集群、读写效率高,成本低(即对硬件要求不高,一个笔记本就可以实现)
- 无模式(可扩展性,结构不固定)
- 处理高并发,高数据存储
- eg: mongoDB、redis
mongoDB优点
- 优点
- 运行速度快
- 数据库设计灵活
- 存在文档字段的不一致性
- 由C++语言编写而成
- test 数据库存在于内存中
学习目标
- { name: ‘mongo’, type: ‘DB’ }
- 目标:学会通过 mongoDB 进行开发;
- JS高级课程 — mongoDB
- key value type(ObjectId、Double、String、Array)
mongoDB windows版本下载和安装
下载
- mongoDB下载地址
- 选择 Download 即可
- 下一步:详细安装步骤
- mongoDB 可视化界面下载地址
安装
-
mongoDB 稳定版本2.0
-
本地新建两个文件夹,一个用来存放mongoDB软件,另一个用来存放mongoDB数据库的数据
-
为 mongoDB 配置环境变量
-
打开
cmd
进入mongoDB软件安装的bin目录之下,执行命令:mongod.exe --dbpath mongoDB数据库数据存放的文件夹路径 -
mongoDB 默认使用端口 27017 查看端口占用情况
-
启动数据库服务,根据自己需要修改mongodb.bat 文件( 批处理文件 )
bat 的使用
- mongod -help
- 扩展端口 28017(用于 web 服务)、原生端口 27017 (用于 shell 操作)
mongoDB启动命令mongod 参数说明
--dbpath arg # 指定数据库路径
--port arg # 指定服务端口号,默认端口27017
--auth # 启用验证
--fork # 以守护进程的方式运行MongoDB,创建服务器进程
--rest # 开启简单的rest API
mongoDB 和 关系型数据库的类比
- 在mongoDB 中表称为集合collection ;
- 在MongoDB中表的一行数据称为文档document
- _id 相当于 关系数据库中的主键
- 在MongoDB中表字段称为键key, 字段值称为值value,没有主键、外键;灵活度扩展性极高
- mongoDB的每一个document的key可以不一样
- MongoDB查询使用内置find函数 -> 基于 BSON 的特殊查询工具
- 自动管理空数据库,无数据自动删除
关系型数据库中:database、table、record、field; 而非关系型数据库:database、collection、document、JSON
MongoDB常见操作
- 创建一个数据库
- 查看所有数据库
- 给指定数据库添加集合并且添加记录
- 查看数据库中的所有文档
- 查询制定文档的数据
- 更新文档数据
- 删除文档中的数据
- 查看当前正在哪个数据库中:db + [Enter] 回车
- 选中哪个数据库:use + 数据库名称 [Enter] 回车
- 显式创建集合:db.createCollection(‘集合名称’)
常用 Shell 基本操作
- 相当于 mongoDB 客户端 — 即JavaScript 引擎
- 创建一个批处理文件( .bat ) , 内容是执行 mongo.exe 127.0.0.1:27017/admin
- 默认存在 admin (超级管理员)、test 用户
- JavaScript Shell
use mongoDB_test # 创建一个数据库 mongoDB_test 存在即进入,否则即创建该数据库
db.persons.insert({name:“美好事物”}) # 给指定数据库创建集合并且添加记录
show dbs # 查看所有数据库
show collections # 查看数据库中有哪些集合collection
db.system.indexes.find() # 查看 集合结构
查询第一条document文档:findOne()
db.persons.update({name: “zs”}, {$set:{name:“lisi”}}) # 更新文档数据
db.persons.remove({…}) # 删除文档中的数据
删除数据库中的集合:db.persons.drop()
删除当前数据库: db.dropDatabase()
shell 的 help
mongoDB 的 API
数据库帮助:db.help() 、db.getName() ( 获取数据库名称 )
获取数据库的信息:db.stats()
查看数据库中集合list 的长度:db.persons.count()
- 数据库和集合命名规范: 不能是空字符串;不能包含’‘,空格、,、$、/、\、\O(空字符); 应该全部小写; 最多64个字节; 数据库名称不能与系统保留库同名,eg: local、admin、config…
- db.getCollection(documentName) 适用于 命名中包含” - “此类符号的情况
- mongoDB 的shell 内置javascript 引擎可以执行js代码
- shell 可以 使用 eval:db.eval(“return ‘美好事物’”) 执行js 代码 返回 值
Document 数据操作
- $set修改器 存在key即是更新 否则是添加
- $inc修改器 进行数字类型的加减操作
- $unset修改器 进行键值对的删除 db.persons.update({条件},{$unset: {需要删除的key: 1}})
- $push修改器 进行数组元素的添加操作 db.persons.update({},{$push: {}),当设置的key 不存在,则进行创建key
- $pushAll 一次性添加多个元素到key 是数组类型的集合中
- $addToSet 向数组内添加元素,当元素存在,啥也不做,元素不在数组,进行添加操作
- $pop 删除数组中的元素,当为1 时删除最后一个元素,-1 则删除第一个元素
- $pull 根据具体值删除数组的单个元素
- $pullAll 根据具体的值删除数组中的多个元素
- $操作用来当数组中存在多个文档时,修改单个文档的情况,结合 $set使用
- $addToSet 结合$each 实现数组批量更新,遍历更新值进行$addToSet操作
- db.runCommand函数(针对单文档进行操作 .value) 和 findAndModify 函数
Document数据添加
- db.persons.insert({})
- 通过 shell 的 for 循环 来实现批量添加文档
- save 进行操作时如果_id 已经存在则进行更新操作,否则进行的是添加文档操作
Document数据删除
- db.persons.remove({}) # 只删除文档的数据,保存文档的结构
Document数据更新
- 强制更新文档:db.person.update({旧的文档条件}, {新的文档})
- update方法还有第三参数,类型是一个bool值 ,默认是false,当值为true时,会判断_id是否存在,存在即更新,否则即进行添加操作
- 批量更新实现:使用$set , update方法的第四个参数设置为true时 代表批量更新
mongodb 内存分配
- Document 、预留内存
Find
- db.persons.find({}, {指定返回的键}) 当不指定_id: 0 时查询结果会显示_id
db.persons.find({}, {_id: 0, name: 1})
查询条件:小于(<, 即$lt)、小于等于(<=, 即$lte)、大于(>, 即$gt)、大于等于(>=,即$gte)、不等于(!=, 即$ne)
db.persons.find({age: {$gte: 25, $lte: 27}}, {指定返回的键})
$in、$nin:db.persons.find({age: {$in: [25, 27]}})
db.persons.find({$or: [{age: {$gt: 25}}]})
[null]
正则表达式查询: /\d/i
$not 可以用在任何地方
数组查询$all、$size、数组.下标 arr.index books.1: ‘js’
$slice : [index] 正整数 从左开始截取,负数从右开始截取
文档document查询
db.persons.find({school: {$elemMatch: {school: “K”, score: “A”}}})
$where 复杂查询 非常消耗性能 db.persons.find({"$where": function () {…}})
分页与排序
- limit(5) # 获取前五项
- db.person.find({}, {}).limit(5)
- skip(5) # 跨越 五条
- sort({…}) 排序
- it 翻页
游标
- 使用完即销毁
- 十分钟没有使用,自动销毁
索引
- 相当于目录,加快查询效率,提升性能
- 索引的建立,但是会影响插入数据的性能,一般用在不插入数据经常查询的文档中
db.persons.ensureIndex({number: 1}) # 为 number 这个key 设置索引
number: 1 # 正序索引
number: -1 # 倒序索引
-
创建索引并指定自定义索引名称:db.persons.ensureIndex({name: -1}, {name: customName})
-
唯一索引:不能插入重复的数值 db.persons.ensureIndex({name: -1}, {unique: true})
-
删除重复的:db.persons.ensureIndex({name: -1}, {unique: true, dropDups: true})
-
使用指定索引:db.persons.find({name: “test”}).hint({name: -1})
-
查看查询状态信息:db.persons.find().explain()
-
后台运行 : background: true
-
删除索引:db.runCommand({dropIndexes: ‘集合’,index: ‘索引名称’}) # 精确删除 db.runCommand({dropIndexes: “集合”,index: “*”}) # 批量删除
mongodb 的二维索引
- 为集合创建2D索引: db.persons.ensureIndex({gis: “2d”}, {min: -1, max: 200})
- 默认创建 {min: -180, max: 180} 之间 的2D索引
- db.persons.find({gis: {$near: [70, 180]}}, {gis: 1}).limit(3) # 查找离[70, 180] 最近的三个点
- db.persons.find({gis: {$within: {$box: [[50, 50], [190, 190]]}}}, {gis: 1}) # 查找以 [50, 50]、[190, 190] 为对角线的矩形内的点
- db.persons.find({gis: {$within: {$center: [[56, 80], 50]}}}, {gis: 1}) # 查找以[56, 80] 为圆心,半径为 50 的圆内的所有点
- db.persons.find().count() # 查看集合数据条数
- db.runCommand({distinct: “persons”, key: “country”}).values # 查询出所有key 为country的数据
- db.runCommand({group: {ns: 集合名称, key: {分组键即key: true},initial: {},$reduce: function (doc, prev) {},condition: {m: {$gt: 90}}}})
finalize: function (prev) {
...
},
$keyf: function (doc) { return {country: doc.country}}
- $keyf 解决 key 存在多个相似的,只是大小写区别的key 键
命令执行器:db.runCommand({})
db.runCommand({drop: "persons"}) # 删除集合操作
查询有哪些命令:db.listCommands()
db.runCommand({buildInfo: 1}) # 查询服务器版本号和主机操作系统
db.runCommand({collStats: "persons"}) # 查询集合的详细信息
db.runCommand({getLastError: "persons"}) # 查看错误信息
固定集合
- 固定集合:记录日志、固定大小…
- 特点:可以指定集合大小,指定文档数量;没有索引;固定的空间,不用分配新的空间,插入数据速度快;固定集合的顺序是确定的;
BSON扩充的数据类型
- 一种数据格式 是JSON数据格式的扩展形式
- 由于 JSON 无法满足 浮点型、日期型、…等等特殊类型 ---- BSON数据格式的诞生
- 文件格式转换,将json文件转换成二进制文件,存储于NoSql数据库中
- null、布尔、浮点数、UTF-8 字符串类型、对象ID、日期、正则、Javascript代码块、undefined、数组、内嵌文档、二进制
- 文件存储格式
mongoVUE安装和使用
- todo
应用场景
- eg: FaceBook