mongodb有一个类似于orm映射的框架:morphia。其性质就类似于hibernate一样。 但它对mapreduce方法的包装并不是很方便使用,下面示例如下:
public List<WeixinBean> getNewMessage(long updateTime) {
//按用户分组,得到最小发送时间和最大更新时间
String map = "function(){emit( this.openID+'#'+this.officalID,{ postTime: this.postTime,updateTime: this.updateTime} ); }";
String function = "function(v){"
+ "if(res.postTime == 0){"
+ "res.postTime = v.postTime;"
+ "}else if(res.postTime > v.postTime){"
+ "res.postTime = v.postTime;"
+ "}"
+ "if(res.updateTime < v.updateTime){"
+ "res.updateTime = v.updateTime;"
+ "}"
+ "}";
String reduce = "function(key,values){"
+ "var res = { postTime: 0,updateTime: 0}; "
+ "values.forEach( "
+ function
+ " );"
+ "return res;"
+ "}";
String outputCollection = "test";
//在执行mapreduce之前,先查询出指定时间范围的数据作为map的输入
BasicDBObject queryForMap = new BasicDBObject();
// if(compareCondition.equals(">")){
//此处特别注意:不要使用put方法,否则查询无效,比如:new BasicDBObject().put("$gt", updateTime)
queryForMap.append("updateTime", new BasicDBObject().append("$gt", updateTime));
// }
DBCollection weixinCollection = ds.getCollection(WeixinBean.class);
MapReduceCommand cmd = new MapReduceCommand(
weixinCollection,
map,
reduce,
null,
OutputType.INLINE,
queryForMap);
MapReduceOutput out = weixinCollection.mapReduce(cmd);
CommandResult cr = out.getCommandResult();
BasicDBList list = (BasicDBList)cr.get("results");
List<WeixinBean> weixinList = new ArrayList<WeixinBean>();
for(int i = 0 ; i < list.size() ; i++){
BasicDBObject weixinObject = (BasicDBObject)list.get(i);
System.out.print(weixinObject.getString("_id"));
BasicDBObject value = (BasicDBObject)weixinObject.get("value");
System.out.println(",postTime="+value.getLong("postTime") + ",updateTime="+ value.getLong("updateTime"));
WeixinBean wb = new WeixinBean();
String[] userIdArray = weixinObject.getString("_id").split("#");
wb.setId(weixinObject.getString("_id"));
// wb.setopenID(userIdArray[0]);
// wb.setofficalID(userIdArray[1]);
wb.setPostTime(value.getLong("postTime"));
wb.setUpdateTime(value.getLong("updateTime"));
weixinList.add(wb);
}
return weixinList;
// DBCollection resultColl = out.getOutputCollection();
// DBCursor cursor= resultColl.find();
// while (cursor.hasNext()) {
// System.out.println(cursor.next());
// }
// MapreduceResults<WeixinBean> res = this.ds.mapReduce(MapreduceType.REDUCE, query, WeixinBean.class, cmd);
// MapreduceResults<WeixinBean> res = ds.mapReduce(MapreduceType.INLINE, query, map, reduce, null, null, WeixinBean.class);
//
// res.setInlineRequiredOptions(WeixinBean.class, ds.getMapper(), new DefaultEntityCache());
// Iterator<WeixinBean> it = res.getInlineResults();
Iterator<WeixinBean> it = res.iterator();
// while(it.hasNext()){
// WeixinBean wb = it.next();
// System.out.println(wb.getId()+"-->"+wb.getPostTime());
// }
//
// System.out.println(res.getCounts());
}