MongoDB数据库文档大全(第4-6讲)

第四讲
索引详讲

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值