乐趣区

关于mongodb:关于MongoDB

简介

MongoDB 为面向文档(基于分布式文件存储)数据库(非关系型数据库)非关系型数据库的构造:一台服务器 => 数据库 => 汇合 => 文档

非关系型数据库用于超大规模数据的存储

面向文档数据库会将数据以文档模式存储。每个文档都是自蕴含的数据单元,是一系列数据项的汇合。每个数据项都有一个名词与对应值,值既能够是简略的数据类型,如字符串、数字和日期等;也能够是简单的类型,如有序列表和关联对象。数据存储的最小单位是文档,同一个表中存储的文档属性能够是不同的,数据能够应用 XML、JSON 或 JSONB 等多种形式存储

长处:高性能,易部署,易使用,存储数据不便
面向汇合存储,易存储对象类型的数据
模式自在
反对动静查问
反对齐全索引,蕴含外部对象
反对查问
反对复制和故障复原
应用高效的二进制数据存储,包含大型对象(如视频)主动解决碎片,以反对云计算档次的扩展性
反对 ruby,python,java,c++,php 等多种语言
文件存储格局为 BSON(一种 JSON 的扩大),可间接存储对象,数组

局部利用场景:视频直播:应用 MongoDB 存储点赞,评论,弹幕信息...
游戏场景:应用 MongoDB 存储打怪记录,用户积分...
社交场景:应用 MongoDB 存储朋友圈信息,浏览记录...
电商场景:应用 MongoDB 存储购物车,珍藏...

官网:https://www.mongodb.com/

MongoDB 的装置

 下载安装地址:https://www.mongodb.com/try/download
windows 具体装置与配置教程可查看网址:https://blog.csdn.net/baidu_39298625/article/details/98592631

MongoDB 的可视化工具

RoBo3T 是 MongoDB 的可视化界面管理工具
下载安装地址:https://robomongo.org/download
具体装置与配置教程可查看网址:https://www.cnblogs.com/smart-girl/p/11283449.html

MongoDB 的文件目录阐明

将 MongoDB 装置成 window 服务

 先在非系统盘下创立一个文件夹 mongodb,再创立两个子文件夹 db 和 log

应用命令挂载服务:在 cmd 中输出命令:mongod --dbpath "G:\mongodb\db"(db 的门路)--logpath "G:\mongodb\log\mongodb.log"(log 文件夹的门路,主动创立一个 mongodb.log 文件)--install --serviceName "MongoDB"(服务名称)查看服务:我的电脑 -> 右键 -> 治理 -> 服务与应用程序 -> 服务

应用这些命令的前提是已挂载到 windows 服务上
开启服务的命令:net start mongodb(服务名)敞开服务的命令:net stop mongodb(服务名)卸载服务的命令:sc delete mongodb(服务名)没有挂载服务的话,可间接在 cmd 中进入 mongodb 的 bin 目录下,输出命令:mongod --dbpath= G:\mongodb\data(data 的门路)来开启服务

MongoDB 常用命令

 进入数据库管理模式:mongo
在数据库管理模式中只能执行数据库命令,不能执行其余命令 

 退出数据库管理模式:exit

罕用的数据库命令:1. 显示所有的数据库列表:show dbs
2. 创立数据库:use 数据库名(若数据库名不存在则创立,若已存在则进入)3. 查看以后数据库是哪个:db
4. 删除数据库:db.dropDatabase()

对于汇合的命令:1. 显示以后数据库的所有汇合:show collections
2. 创立汇合:db. 汇合名.insert({})(通常在创立数据时主动创立汇合,不须要独自创立)db.createCollections(汇合名)
3. 删除汇合:db. 汇合名.drop()

对于文档(数据)的操作:1. 新增文档(数据):db. 汇合名.insert({BSON 数据})(向汇合中插入一条数据)(举荐应用)db. 汇合名.save({BSON 数据})(向汇合中插入一条数据,若汇合中曾经存在该数据则更新)(该办法新版本已弃用,可应用 db. 汇合名.insertOne() 或 db. 汇合名.replaceOne())db. 汇合名.insertOne({BSON 数据}) 
2. 查看文档(数据):db. 汇合名.find()(查找以后汇合中的所有数据,是个数组)db. 汇合名.find({条件对象})(查找符合条件的文档(数据))db. 汇合名.findOne()(查找以后汇合中的第一条数据)db. 汇合名.find().pretty()(将找到的数据以格式化的结果显示进去)3. 批改文档(数据):db. 汇合名.update(查找的对象,批改后果)
                    db. 汇合名.update({批改 1},{批改 2},{multi:true})({multi:true} 示意能更新多条数据)db. 汇合名.update({条件},{$inc:{key:value}})($inc 实现对某列的值进行自增操作)4. 删除文档(数据):db. 汇合名.remove({})({} 为空则删除以后汇合中的所有数据,{} 有值则删除合乎对应条件的数据)(因为删除和更新操作数据会造成极大影响,所以要审慎!)一些高级命令:1. 按指定条件查问:db. 汇合名.find({key:value})
2. 按大于某个范畴的条件查问:db. 汇合名.find({key:{$gt:value}})(key>value)3. 按大于等于某个范畴的条件查问:db. 汇合名.find({key:{$gte:value}})(key>=value)4. 按小于某个范畴的条件查问:db. 汇合名.find({key:{$lt:value}})(key<value)5. 按小于等于某个范畴的条件查问:db. 汇合名.find({key:{$lte:value}})(key<=value)6. 查问指定范畴的数据:db. 汇合名.find({key:{$gt:value1,$lt:value2}})
7. 查问指定的数据是否在数组中:db. 汇合名.find({key:{$in:[...]}})
8. 按数组元素的个数查找:db. 汇合名.find({key:{$size: 数量}})
9. 查找多个条件中合乎其中一个条件的数据:db. 汇合名.find({$or:[{key1:value1},{key2:value2},...}]})
10. 查找同时合乎多个条件的数据:db. 汇合名.find({key1:value1,key2:value2})
11. 排序:db. 汇合名.find().sort({key1:1/-1,key2:1/-1})(1 代表升序,- 1 代表降序)12. 限定输入数据的条数.limit(Number),跳过指定的数据条数.skip(Number)(配合应用,个别用作分页性能)返回汇合的条数:db. 汇合名.find().count()
e.g. 当初有 100 条数据,每页显示 10 条,一共有多少页?(10 页)若以后在第 2 页上,应显示哪些数据?(11-20 之间的数据(即跳过前 10 条))13. 含糊查问:db. 汇合名.find({key:/ 相应的 reg/})(可用于查找某姓之人或含某些关键字的)

MongoDB— 聚合函数

MongoDB 中聚合次要用于解决数据(如:统计平均值,求和等),并返回计算后的数据后果

聚合的办法应用 aggregate()
根本的语法格局:db. 汇合名.aggregate([
    {管道:(聚合操作表达式)}
])

管道:把聚合操作表达式找到的数据进行过滤 



 罕用的聚合表达式:$sum:计算总和({$sum:1} 相当于 count(*) 计算全副)$avg:计算平均值
$min:获取汇合中所有文档对应值的最小值
$max:获取汇合中所有文档对应值的最大值

例子:

MongoDB 的平安认证(理解)

 查问所有角色权限(仅含用户自定义角色):db.runCommand({rolesInfo:1})
查问所有角色权限(蕴含内置角色的所有角色):db.runCommand({rolesInfo:1,showBuiltinRoles:true})
查问其它数据库中指定的角色权限:db.runCommand({rolesInfo:{role: 角色名,db: 数据库名}})
查问多个角色权限:db.runCommand({rolesInfo:[ 角色名...,{role: 角色名,db: 数据库名}]})
常见的角色:

 增加用户和权限:进入数据库后 

 认证测试:切换到 admin 数据库中,输出命令:db.auth('账号','明码')

创立普通用户:

 开启认证:


MongoDB— 索引

 索引分类:单字段索引,复合索引,天文空间索引,文本索引,哈希索引,...

全文检索:

 启用全文检索:

 创立索引:db. 汇合名.createIndex(keys,options)
options 的配置:background(布尔类型,默认为 false,指定是否后盾创立索引。在创立索引过程中会阻塞数据库的其余操作,而后盾创立就会防止这种问题)unique(布尔类型,默认为 false,指定建设的索引是否惟一)name(索引名称,默认通过建设索引的字段名和排序程序生成索引名称)删除索引:db. 汇合名.dropIndex(索引名称或索引键值对)

查看索引:db. 汇合名.getIndexes()(返回一个汇合中的所有索引)查看汇合索引大小:db. 汇合名.totalIndexSize()

利用查问剖析可确保建设的索引是否无效:

MongoDB— 数据库备份与复原

 备份:应用 mongodump 命令(可导出所有数据到指定目录中,还可通过参数指定导出的数据量级转存的服务器)mongodump 命令语法:



 复原:应用 mongorestore 命令
mongorestore 命令语法:


mongoose 模块

node.js 利用 mongoose 模块来操作 MongoDB,是一种便捷的封装,一种对象模型工具  

mongoose 官网:http://www.mongoosejs.net/

装置 mongoose:npm install mongoose(装置前提是要先装置 express 框架)引入 mongoose 模块:var mongoose = require('mongoose');

连贯数据库:mongoose.connect('mongodb://127.0.0.1:27017/ 数据库名(服务器地址)',(err)=>{...(有谬误则 throw err)})(MongoDB 的默认端口号为:27017)(在 routers 目录下的 index.js 中编写连贯数据库的命令)骨架 Schema:一种以文件模式存储的数据库模型骨架,不具备数据库操作能力
不仅定义了文档构造和使用性能还能够扩大插件,实例办法,复合索引,文档生命周期钩子
Model:由 Schema 公布生成的模型,具备形象属性和行为的数据库操作的能力,通常用于读取数据库(查)Entity:由 Model 创立的实体,其操作也会影响数据库,通常用于写数据(增删改)连贯数据库后,存储数据的步骤:定义骨架(Schema)-> 创立模型(Model)-> Entity 实例化办法

定义骨架:var schema=new mongoose.Schema({
    字段名:类型,(类型:String,Number,Date,Buffer,ObjectId,Array,Boolean,...)(若骨架没有定义属性及类型,是不能被加进数据库的)...
})

创立模型:var model=mongoose.model(模型名,骨架名,汇合名称(与模型名保持一致))
创立好 model 后,就能够应用相应的办法:依据条件进行数据查问,能够找出多条数据:model.find({条件},(err,data)=>{...(data 是从数据库中读取到的数据)})(find 找进去的数据肯定是一个数组)依据 id 查找一条数据:model.findById('id',(err,data)=>{..,})(findById 找进去的数据是一个对象)另一种罕用写法:model.find({}).limit().exec((err,data)=>{...})(益处是可实现链式调用)创立实体 Entity(依赖于 Model):var 实体名 =new 对应的模型 ();
新增数据:实体名. 属性名 = 属性值;
实体名.save(()=>{});(将增加到实体上的属性保留到数据库中)删除数据:先找出要删除的数据,再调用 remove() 办法删除数据:实体名.remove(()=>{}); 
如:model.findById(id).exec((err,data)=>{data.remove(err)=>{...}})
批改数据:先找出要批改的数据,将数据批改后保留回数据库
如:model.findById(id).exec((err,data)=>{data.name= 新值;data.save(()=>{...}))})
退出移动版