博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mongodb笔记(三)user && aggregate && mapReduce
阅读量:5890 次
发布时间:2019-06-19

本文共 3045 字,大约阅读时间需要 10 分钟。

版本: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)。

      

转载于:https://www.cnblogs.com/ztwBlog/p/6282367.html

你可能感兴趣的文章
软件工程项目组Z.XML会议记录 2013/11/27
查看>>
科学计算库学习报告
查看>>
软件测试 -- 软件测试的风险主要体现在哪里
查看>>
Ubuntu中无法update的解决办法
查看>>
仿射变换
查看>>
decltype类型指示符
查看>>
虹软ArcFace人脸识别 与 Dlib 人脸识别对比
查看>>
laravel 验证码使用示例
查看>>
IE开发人员工具无法使用
查看>>
分页器(自定制)
查看>>
crossplatform---Nodejs in Visual Studio Code 05.Swig+Bootstrap
查看>>
HDU1877 又一版 A+B
查看>>
往sde中导入要素类报错000732
查看>>
springboot之启动方式
查看>>
初次安装git配置用户名和邮箱及密钥
查看>>
6.1(续)索引、索引组织表--Oracle模式对象
查看>>
工作5年左右的程序员如何在职业瓶颈期内快速提升自己的身价?提升后如何有效变现自己的高质量技能?...
查看>>
动画 球
查看>>
C++中的堆,栈,静态内存区,常量区
查看>>
动态SQL实现与注意事项(有返回值与无返回值动态SQL 实现)
查看>>