《JS高级 之 mongoDB 学习笔记》

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 稳定版本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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值