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