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);
}