zoukankan      html  css  js  c++  java
  • Mongodb笔记(三)user && aggregate && mapReduce

    版本:mongodb3.4。

    User:

       mongodb使用验证登录;默认不开启,mongod中使用--auth开启:

       mongod -port=3000 --auth  ;

       基本方法:

         

    db.createUser({
         user:username,
         pwd:passwd,
         roles:[ {role:  ' readWrite' , db : 'db1'} ]   //定义这个用户对应db的权限。 
    });
    
    db.updateUser(username,{
        pwd:'',
        roles:[]
    })    
    
    db.dropUser(username);
    
    db.changeUserPassword(username,newpswd);
    

       具体roles:参见

       在mongod开启验证前先在默认模式下,创建超级用户:

       mongo:

        use admin;

        db.createUser({user : 'myRoot' ,  pwd: '***' ,  roles: [ role:'root' , db:'admin' ] });

      在创建好超级用户后,再开启mongod的验证模式,这样以后就能考靠这个超级用户来创建其他用户了。

      登录mongod:

        mongo -port=3000 -username=myRoot -password= *** -authenticationDataBase=admin

           authenticationDataBase ,指定你登录的DataBase.

      另一种方法:

        mongo -port=3000;

        use admin;

        db.auth('myRoot','***');

      登录后因为你是超级用户所以可以创建其它用户,并指定权限。

      mongodb在用户登录时,使用明文传输数据。建议使用TSL。

      

     

    Aggregate:

         Instance:

      db.test.aggregate([

        {$match: {city: 'shanghai' }},                             //匹配城市是上海的人。

        {$limit:5},                                   //只取5个document。  

        {$group:{_id:'$sex'   ,  ageAvg: {$avg:'$age'} }}   //将这5个人按照性别分组,ageAvg获得他们的平均属性。

      ])

      aggregate中的可用操作符是比较多,比如$project:

     

    db.test.aggregate([
        {$group:{id:'$sex', ageArr: { $push : '$age'}}}  ,
        {$project: {_id:'$name', sumAge: {
              $reduce:{
                   input:'$ageArr',
                   initialVal: 0,
                   in: [ '$$value' ,' $$this']   //value指initialVal的值,this指遍历ageArr时的当前值。
              }
        }}}  
    ])    
    

      其实功能是相同于$group:{_id:'$sex',ageArr:{$sum:'$age'}}的。不过这个例子的灵活性更高。

       project可以理解为基于上一个collection,做一个映射的collection。

         再介绍一个$redact:

        可以根据field,甚至内嵌文档中的field,来过滤document.

    db.test.aggregate([
       {$math:{city:'shanghai'}},
       {$redact:{
             $cond:{
                     if: {$gt:['$age', 15 ]},    //比较操作符:大于15返回ture;小于false;
                     then:$$DESCEND,        //true,那么继续下降,到内嵌文档,进行判断。
                     else: $$PRUNE,              //false,删除当前文档。
                    }
                }
    
       }
    ])    
    

       redact还有一个Variable:$$keep意为保持现状,不删除,不下降。

       age小于15的document将被删除,父document的age属性大于15,但因为配置了$$DESCEND,如果子document中age小于15,整个document都会被删除。

       而如果父document中没有age属性,子document中即便age小于15,也不会被删除。

      

        

     

    mapReduce

    db.test.mapReduce(
       map(),                           //2
       reduce(),                        //3
       {
           query: {age:{$gt:10}},      //1 step1标记是执行顺序。首先筛选age大于10的。
           out:'ouo_file',             //5 step5 最后生成的collection导出在out_file这个colletion中。
           finalize:finalize()         //4
         }   
    );
    
    function map(){
      emit(this.name,this.age);        //step2 可以随便发送。第一个值将作为主键,用于分组。第二个值,被push入各组的array中。
    }
    
    function reduce(key,values){     //step3  组已经被分好,这里处理这个array。并返回一个值。这样新的collection就快要诞生了。
      return values.reduce((pre,cur)=>{    
              return pre*cur;
             })  
    }
    function finalize(val){            //step4 为处理后的array值再做一次更改,此步可以省略。
       return 'result:' +val;
    }
    

     序号是其执行顺序。mapReduce比aggregate灵活些。不过aggregate的方法都是内部封装,性能上要优于mapReduce。而一般情况,aggregate都能满足需求。

       out的其他选项:

                    out:{ merge:'out_put'};   与已存在的out_put进行合并。

                    out:{ reduce :'out_put'};  将所得的value值与已存在的out_put内每个document 中value值相+ ( string+string ,number+number)。

          

  • 相关阅读:
    转载一篇不错的Mac上安装Apache和多版本PHP的文章
    Mac 上配置tomcat 及可能碰到的问题。
    iOS通知中心 NSNotificationCenter详解
    字符缓冲区读取文件BufferedReader
    BufferedWriter—newLine
    缓冲流复制文件与基本流复制文件比较
    BufferedOutputStream缓冲流
    properties集合
    JDK7,JDK9流中异常的处理
    try-catch-finally处理流中的异常
  • 原文地址:https://www.cnblogs.com/ztwBlog/p/6282367.html
Copyright © 2011-2022 走看看