MongoDB数据库文档大全(第4-6讲)
来源:互联网 发布:qq浏览器数据清除不了 编辑:程序博客网 时间:2024/05/21 14:07
第四讲
索引详讲
1.创建简单索引
数据准备index.js
1.先检验一下查询性能
var start = new Date()
db.books.find({number:65871})
var end = new Date()
end - start
2.为number 创建索引
db.books.ensureIndex({number:1})
3.再执行第一部的代码可以看出有数量级的性能提升
2.索引使用需要注意的地方
1.创建索引的时候注意1是正序创建索引-1是倒序创建索引
2.索引的创建在提高查询性能的同时会影响插入的性能
对于经常查询少插入的文档可以考虑用索引
3.符合索引要注意索引的先后顺序
4.每个键全建立索引不一定就能提高性能呢
索引不是万能的
5.在做排序工作的时候如果是超大数据量也可以考虑加上索引
用来提高排序的性能
3.索引的名称
3.1用VUE查看索引名称
3.2创建索引同时指定索引的名字
db.books.ensureIndex({name:-1},{name:"bookname"})
4.唯一索引
4.1如何解决文档books不能插入重复的数值
建立唯一索引
db.books.ensureIndex({name:-1},{unique:true})
试验:
db.books.find({name:"0book"})
db.books.insert({name:"0book"})
会报错:E11000 duplicate key error index: foobar.books.$name_1 dup key: { : "0book" }
5.踢出重复值
5.1如果建议唯一索引之前已经有重复数值如何处理
db.books.ensureIndex({name:-1},{unique:true,dropDups:true})
6.Hint
6.1如何强制查询使用指定的索引呢?
db.books.find({name:"1book",number:1}).hint({name:-1})
指定索引必须是已经创建了的索引
7.Expain
7.1如何详细查看本次查询使用那个索引和查询数据的状态信息
db.books.find({name:"1book"}).explain()
索引管理
1.system.indexes
1.1在shell查看数据库已经建立的索引
db.system.indexes.find()
db.system.namespaces.find()
2.后台执行
2.1执行创建索引的过程会暂时锁表问题如何解决? 为了不影响查询我们可以叫索引的创建过程在后台
db.books.ensureIndex({name:-1},{background:true})
3.删除索引
3.1批量和精确删除索引
db.runCommand({dropIndexes : "books" , index:"name_-1"})
db.runCommand({dropIndexes : "books" , index:"*"})
空间索引
1.mongoDB提供强大的空间索引可以查询出一定范围的地理坐标.
看例子 准备数据map.json
1.查询出距离点(70,180)最近的3个点
添加2D索引
db.map.ensureIndex({"gis":"2d"},{min:-1,max:201})
默认会建立一个[-180,180]之间的2D索引
查询点(70,180)最近的3个点
db.map.find({"gis":{$near:[70,180]}},{gis:1,_id:0}).limit(3)
2.查询以点(50,50)和点(190,190)为对角线的正方形中的所有的点
db.map.find({gis:{"$within":{$box:[[50,50],[190,190]]}}},{_id:0,gis:1})
3.查询出以圆心为(56,80)半径为50规则下的圆心面积中的点
db.map.find({gis:{$within:{$center:[[56,80],50]}}},{_id:0,gis:1})
第五讲
Count+Distinct+Group
1.Count
请查询persons中美国学生的人数.
db.persons.find({country:"USA"}).count()
2.Distinct
请查询出persons中一共有多少个国家分别是什么.
db.runCommand({distinct:"persons" , key:"country"}).values
3.Group
语法:
db.runCommand({group:{ns:集合名字,Key:分组的键对象,
Initial:初始化累加器,
$reduce:组分解器,
Condition:条件,
Finalize:组完成器
}})
分组首先会按照key进行分组,每组的每一个文档全要执行$reduce的方法,
他接收2个参数一个是组内本条记录,一个是累加器数据.
3.1请查出persons中每个国家学生数学成绩最好的学生信息(必须在90以上)
db.runCommand({group:{
ns:"persons",
key:{"country":true},
initial:{m:0},
$reduce:function(doc,prev){
if(doc.m > prev.m){
prev.m = doc.m;
prev.name = doc.name;
prev.country = doc.country;
}
},
condition:{m:{$gt:90}}
}})
3.2在3.1要求基础之上把每个人的信息链接起来写一个描述赋值到m上
finalize:function(prev){
prev.m = prev.name+" Math scores "+prev.m
}
4.用函数格式化分组的键
4.1如果集合中出现键Counrty和counTry同时存在那分组有点麻烦这要如何解决呢?
db.runCommand({group:{
ns:"persons",
$keyf:function(doc){
if(doc.counTry){
return {country:doc.counTry}
}else{
return {country:doc.country}
}
},
initial:{m:0},
$reduce:function(doc,prev){
if(doc.m > prev.m){
prev.m = doc.m;
prev.name = doc.name;
if(doc.country){
prev.country = doc.country;
}else{
prev.country = doc.counTry;
}
}
},
finalize:function(prev){
prev.m = prev.name+" Math scores "+prev.m
},
condition:{m:{$gt:90}}
}})
数据库命令操作
1.命令执行器runCommand
1.1用命令执行完成一次删除表的操作
db.runCommand({drop:"map"})
{
"nIndexesWas" : 2,
"msg" : "indexes dropped for collection",
"ns" : "foobar.map",
"ok" : 1
}
2.如何查询mongoDB为我们提供的命令
1.在shell中执行 db.listCommands()
2.访问网址http://localhost:28017/_commands
3.常用命令举例
3.1查询服务器版本号和主机操作系统 db.runCommand({buildInfo:1})
3.2查询执行集合的详细信息,大小,空间,索引等……
db.runCommand({collStats:"persons"})
3.3查看操作本集合最后一次错误信息
db.runCommand({getLastError:"persons"})
固定集合特性
1.固定集合概念
2.固定特性
2.1固定集合默认是没有索引的就算是_id也是没有索引的
2.2由于不需分配新的空间他的插入速度是非常快的
2.3固定集合的顺序是确定的导致查询速度是非常快的
2.4最适合的是应用就是日志管理
3.创建固定集合
3.1创建一个新的固定集合要求大小是100个字节,可以存储文档10个
db.createCollection("mycoll",{size:100,capped:true,max:10})
3.2把一个普通集合转换成固定集合
db.runCommand({convertToCapped:"persons",size:100000})
4.反向排序,默认是插入顺序排序.
4.1查询固定集合mycoll并且反响排序
db.mycoll.find().sort({$natural:-1})
5.尾部游标,可惜shell不支持java和php等驱动是支持的
5.1尾部游标概念
这是个特殊的只能用到固定集合本身上的游标,他在没有结果的时候也不回自动销毁他是一直等待结果的到来
GridFS文件系统
1.概念
GridFS是mongoDB自带的文件系统他用二进制的形式存储文件
大型文件系统的绝大多是特性GridFS全可以完成
2.利用的工具 mongofiles.exe
3.使用GridFS
3.1查看GridFS的所有功能
cmd mongofiles
3.2上传一个文件
mongofiles -d foobar -l "E:\a.txt" put "a.txt"
3.3查看GridFS的文件存储状态
利用VUE查看
集合查看
db.fs.chunks.find() 和db.fs.files.find() 存储了文件系统的所有文件信息
3.4查看文件内容
C:\Users\thinkpad>mongofiles -d foobar get "a.txt"
VUE可以查看,shell无法打开文件
3.5查看所有文件
mongofiles -d foobar list
3.5删除已经存在的文件VUE中操作
mongofiles -d foobar delete 'a.txt'
服务器端脚本
1.Eval
1.1服务器端运行eval
db.eval("function(name){ return name}","uspcat")
2.Javascript的存储
2.1在服务上保存js变量活着函数共全局调用
1.把变量加载到特殊集合system.js中
db.system.js.insert({_id:"name",value:"uspcat"})
2.调用
db.eval("return name;")
System.js相当于Oracle中的存储过程,因为value不单单可以写变量
还可以写函数体也就是javascript代码
db.system.js.insert({_id:"showName",value:function(){return 123}})
db.system.js.find()
db.eval("showName()")
第六讲
mongoDB 启动配置详讲
1.启动项 mongod --help
--dbpath 指定数据库的目录,默认在window下是c:\data\db\
--port 指定服务器监听的端口号码,默认是27017
--fork 用守护进程的方式启动mongoDB
--logpath 指定日志的输出路径,默认是控制台
--config指定启动项用文件的路径
--auth 用安全认证方式启动数据库
1.1利用config配置文件来启动数据库改变端口为8888
mongodb.conf文件
dbpath = D:\sortware\mongod\db port = 8888
启动文件
cd C:\Users\thinkpad\Desktop\MONGODB\mongodb-win32-x86_64-2.0.6\bin\mongod.exe --config ../mongodb.conf
shell文件
mongo 127.0.0.1:8888
2.停止mongoDB服务
1.1ctrl+c 组合键可以关闭数据库
1.2admin数据库命令关闭数据
db.shutdownServer()
导出,导入,运行时备份
1.导出数据(中断其他操作)
打开CMD
利用mongoexport
-d 指明使用的库
-c 指明要导出的表
-o 指明要导出的文件名
-csv 制定导出的csv格式
-q 过滤导出
--type <json|csv|tsv>
1.1把数据好foobar中的persons导出
mongoexport -d foobar -c persons -o D:/persons.json
1.2导出其他主机数据库的文档
mongoexport --host 192.168.0.16 --port 37017
2.导入数据(中断其他操作)
API
http://cn.docs.mongodb.org/manual/reference/mongoimport/
2.1到入persons文件
mongoimport --db foobar --collection persons --file d:/persons.json
1.运行时备份mongodump
API
http://cn.docs.mongodb.org/manual/reference/mongodump/
1.1导出127.0.0.1服务下的27017下的foobar数据库
mongodump --host 127.0.0.1:27017 -d foobar -o d:/foobar
2.运行时恢复mongorestore
API
http://cn.docs.mongodb.org/manual/reference/mongorestore/
2.1删除原本的数据库用刚才导出的数据库恢复
db.dropDatabase()
mongorestore --host 127.0.0.1:27017 -d foobar -directoryperdb d:/foobar/foobar
3.懒人备份
mongoDB是文件数据库这其实就可以用拷贝文件的方式进行备份
Fsync锁,数据修复
1.Fsync的使用
先来看看mongoDB的简单结构
2.上锁和解锁
上锁
db.runCommand({fsync:1,lock:1});
解锁
db.currentOp()
3.数据修复
当停电等不可逆转灾难来临的时候,由于mongodb的存储结构导致会产生垃圾数据,在数据恢复以后这垃圾数据依然存在,这是数据库提供一个自我修复的能力.使用起来很简单
db.repairDatabase()
用户管理,安全认证
1.添加一个用户
1.1为admin添加uspcat用户和foobar数据库的yunfengcheng用户
use admin
db.addUser("uspcat","123");
use foobar
db.addUser("yunfengcheng","123");
2.启用用户 db.auth("名称","密码")
3.安全检查 --auth
非foobar是不能操作数据库的,启用自己的用户才能访问
非admin数据库的用户不能使用数据库命令,admin数据库中的数据经过认证为管理员用户
4.用户删除操作
db.system.users.remove({user:"yunfengcheng"});
- MongoDB数据库文档大全(第4-6讲)
- MongoDB数据库文档大全(第1-3讲)
- MongoDB数据库文档大全(第7-9讲)
- MongoDB数据库文档大全
- 第6讲 Zend 整合数据库
- MongoDB数据库文档说明
- 文档型数据库Mongodb
- mongodb文档型数据库
- MongoDB数据库文档说明
- MongoDB数据库、文档、集合
- MongoDB 文档、集合、数据库
- MongoDB数据库文档操作
- MongoDB数据库文档操作
- MongoDB数据库文档操作
- MongoDB自学笔记6---3.1 MongoDB文档、集合、数据库概念
- 第⼗九讲:数据库
- mongodb分布式文档存储数据库
- 文档型数据库MongoDB总结
- 硬盘中的文件中毒了要怎么恢复?
- Python读书笔记第九章:数据结构
- 让HTTP萌娘帮你记住状态码吧
- ubuntu haproxy 日志 日志切割
- ruby on rails 安装问题
- MongoDB数据库文档大全(第4-6讲)
- 高手速成android开源项目【tool篇】
- apache 两种工作模式
- oracle和mysql的Blob字段的读取和插入
- sitemesh3 配置文件
- Spring AOP
- 回忆L2/L3交换器的原理
- 主机禁止mail函数实现WordPress评论回复邮件通知
- 【简单题】【数学】-CF-397B-On Corruption and Numbers