mongo的集合操作使用总结

mongo的集合操作使用总结

mongo表结构

统计出来的表结构:

   将rightstate的值为0的数量统计到root_failed,将rightstate的值为0的数量统计到root_success列

java实现的代码:

group by

mongo VUE:

 

 

BasicDBObjectgroupKeys = newBasicDBObject();

        groupKeys.put("uid", true);

        groupKeys.put("appid", true);

        groupKeys.put("pkv", true);

        BasicDBObject condition = new BasicDBObject();

        DBObject initialDBO = new BasicDBObject();

        initialDBO.put("scount", 0);

        initialDBO.put("fcount", 0);

        //rightstate的值只能是1或者0,1标示获取root权限成功,0标示获取root权限失败

        String reduce = "function Reduce(doc, out){if(doc.rightstate==0){out.fcount++;}elseif(doc.rightstate==1){out.scount++;}}";

        String finalize = "function Finalize(out) { return out;}";

        BasicDBList dbo = (BasicDBList)psdkRootRightColl.group(groupKeys, condition, initialDBO, reduce, finalize);

for (Object object : dbo) {

           String scount =

                (null == ((DBObject)object).get("scount") ? "" : ((DBObject)object).get("scount").toString());

            String uid = (null == ((DBObject)object).get("uid") ? "" : ((DBObject)object).get("uid").toString());

            String appid = (null == ((DBObject)object).get("appid") ? "" : ((DBObject)object).get("appid").toString());

            String pkv = (null == ((DBObject)object).get("pkv") ? "" : ((DBObject)object).get("pkv").toString());

           String fcount =

                (null == ((DBObject)object).get("fcount") ? "" : ((DBObject)object).get("fcount").toString());

        }

 

mapreduce实现

需求:按照uid、pkv、appid分组,如果rightstate值为0,标示提权失败,否则提权成功,isonew标示是否是原始新增获得提权。

在VUE里面,map函数:

  

mongo的命令行实现:

 db.runCommand({mapreduce: "right_2015-11-13",

 map: function Map() {

//Mongo的MAPREDUCE如果key的结果只有一个记录,不会执行reduce函数,直接返回map中的值,

//所以emit的value需要写成下面的格式,

                  var fc = 0; var sc = 0; var pnt = 0;var pns = 0;

         if(this.rightstate==0){fc = 1}

         if(this.rightstate==1){sc = 1}

         if(this.isonew==1){pnt = 1}

         if(this.rightstate==1&&this.isonew==1){pns=1}

         emit({"uid":this.uid,"appid":this.appid,"pkv":this.pkv},        

{rightstate:this.rightstate,isonew:this.isonew,scount:sc,fcount: fc,

psdkNewTotal:pnt, psdkNewSuccess:pns}

         );

}

,

 reduce : function Reduce(key, values)

 {     

         varreduced = {rightstate:0,isonew:0,scount:0, fcount:0, psdkNewTotal:0,psdkNewSuccess:0};

         values.forEach(function(val){

         reduced.rightstate=val.rightstate;

         reduced.isonew=val.isonew;

         reduced.fcount+=val.fcount;

         reduced.scount+=val.scount;

         reduced.psdkNewTotal+=val.psdkNewTotal;

         reduced.psdkNewSuccess+=val.psdkNewSuccess;

         });

         returnreduced; }

                   ,

 finalize : function Finalize(key, reduced) {

         returnreduced;

},

 out: { inline : 1 }

 });

 

java代码实现:

     

       String map =

              "function Map() { var fc = 0; var sc = 0; var pnt = 0; var pns =0;     if(this.rightstate== 0){fc = 1}    else { sc = 1}    if(this.isonew==1) {pnt = 1}if(this.rightstate==1&&this.isonew==1){pns=1}     emit( {\"uid\":this.uid,\"appid\":this.appid,\"pkv\":this.pkv},    {rightstate:this.rightstate,isonew:this.isonew,scount:sc, fcount: fc,psdkNewTotal:pnt, psdkNewSuccess:pns} );  }";

       Stringreduce =

              "function Reduce(key, values) {    varreduced = {rightstate:0,isonew:0,scount:0, fcount:0, psdkNewTotal:0,psdkNewSuccess:0}; values.forEach(function(val) {  reduced.rightstate=val.rightstate;  reduced.isonew=val.isonew;  if(val.rightstate==0){reduced.fcount++;} if(val.rightstate==1){reduced.scount ++;}  if(val.isonew==1)    {reduced.psdkNewTotal++;} if(val.rightstate==1&&val.isonew==1){reduced.psdkNewSuccess++;}    }); return reduced;    }";

       MapReduceCommand cmd =

              new MapReduceCommand(psdkRootRightColl, map, reduce, null,

                     MapReduceCommand.OutputType.INLINE, null);

 

       MapReduceOutput out = psdkRootRightColl.mapReduce(cmd);

       for (DBObject o : out.results()) {

           DBObject key = (DBObject) o.get("_id");

           DBObject value = (DBObject) o.get("value");

           String uid = (null == key.get("uid") ? "" : key.get("uid").toString());

           String appid = (null == key.get("appid") ? "" : key.get("appid").toString());

           String pkv = (null == key.get("pkv") ? "" : key.get("pkv").toString());

           //获取不到赋值为0,不影响后续的计算

           String fcount = (null == value.get("fcount") ? "0" : value.get("fcount").toString());

           //获取不到赋值为0,不影响后续的计算

           String scount = (null == value.get("scount") ? "0" : value.get("scount").toString());

           PsdkRootCount prc = new PsdkRootCount();

           prc.setAppkey(appid);

           prc.setDevUserId(uid);

           prc.setPdate(date);

           prc.setPsdkVersion(pkv);

           prc.setRootFailed(fcount);

           prc.setRootSuccess(scount);

           psdkRootCounts.add(prc);

       }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值