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"});

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 怀了双胞胎两个宝宝很挤怎么办 飞机无人陪护如果接机延误该怎么办 过年要坐火车回家 狗狗怎么办 一岁八个月宝宝小腿弯怎么办 2岁宝不愿意坐马桶拉屎怎么办 宝宝两岁多肺炎出院还老咳嗽怎么办 去外国机场买机票不会说外语怎么办 坐飞机不能带的物品办理托运怎么办 深圳外地户口儿童要办身份证怎么办 网上订票错写了护照号怎么办 国航 在智能火车票订飞机票订反了怎么办 办社保卡的时候填错地址怎么办 两个人住酒店只有一张身份证怎么办 农村社保卡信息错了说改不了怎么办 社保卡与原医保卡信息错误怎么办 学校发的社保卡丢了怎么办 魔棒工具选中选区后再怎么办 微信每次打开都出现月球图案怎么办 仙人掌的刺扎手里弄不出来怎么办 保险交满15年领了一年死了怎么办 狗咬了出了点血怎么办 被小狗咬到了吃了海鲜怎么办 想给一个人道歉又不敢说怎么办 被尘封的故事中魔法师不见了怎么办 宝骏5602挡升3挡有点卡怎么办 剥开的榴莲没熟壳又扔了怎么办 视频播放器激活码设备超限了怎么办 ai如何把右边菜单栏隐藏了怎么办 矫正牙齿粘牙齿的胶掉了怎么办 3m双面胶生产的时候胶不干怎么办 新房赠送面积没地热想接地热怎么办 教育网注册报名的用户名忘了怎么办 艺术生校考通过文化没过本线怎么办 想做主持人 但不是播音专业怎么办 微信登录版本最低登录不上怎么办 所录微课的视频声音小是怎么办 电脑开机黑屏只有光标在闪怎么办 联想家悦重装系统时驱动缺失怎么办 ps做到一半电脑重启了怎么办 宝宝起风疹怎么办 要注意的问题 惠普笔记本刚换的显卡又坏了怎么办