之前一直用到的项目是Spring MVC+maven+mysql的,最近有些数据需要用到mongoDB数据库,现在做一些总结。
第一步:加载jar、maven配置
org.mongodb
mongo-java-driver
3.3.0
org.springframework.data
spring-data-mongodb
1.7.1.RELEASE
第二步:配置
1、集群配置
applicationContext.xml
配置文件common-config.properties
mongodb.database=cxstatistics
mongodb.replicaSet= 10.0.11.28:27017,10.0.11.29:27017,10.0.11.30:27017
2、单机配置
applicationContext.xml
配置文件common-config.properties
mongo.dbname =test_db #数据库名称
mongo.password=test_pwd #密码
mongo.username=test_user #用户名
mongo.host= 127.0.0.1#主机
mongo.port= 27017#端口号
mongo.connectionsPerHost= 8#一个线程变为可用的最大阻塞数
mongo.threadsAllowedToBlockForConnectionMultiplier= 4#线程队列数,它以上面connectionsPerHost值相乘的结果就是线程队列最大值
mongo.connectTimeout= 1500#连接超时时间(毫秒)
mongo.maxWaitTime= 1500#最大等待时间
mongo.autoConnectRetry= true#自动重连
mongo.socketKeepAlive= true#scoket保持活动
mongo.socketTimeout=1500#scoket超时时间
mongo.slaveOk=true #读写分离
第三步、MongoDB的增删改查
1、Mongodb对象模型
Interview.java
@Document(collection="pagelog")public class Interview implementsSerializable {/****/
private static final long serialVersionUID = 1L;
@IdprivateString id;privateString time;privateString desc;private long_createtime;privateInteger _processed;private longfid;privateString templateType;private longpuid;publicString getId() {returnid;
}public voidsetId(String id) {this.id =id;
}publicString getTime() {returntime;
}public voidsetTime(String time) {this.time =time;
}publicString getDesc() {returndesc;
}public voidsetDesc(String desc) {this.desc =desc;
}public longget_createtime() {return_createtime;
}public void set_createtime(long_createtime) {this._createtime =_createtime;
}publicInteger get_processed() {return_processed;
}public voidset_processed(Integer _processed) {this._processed =_processed;
}public longgetFid() {returnfid;
}public void setFid(longfid) {this.fid =fid;
}publicString getTemplateType() {returntemplateType;
}public voidsetTemplateType(String templateType) {this.templateType =templateType;
}public longgetPuid() {returnpuid;
}public void setPuid(longpuid) {this.puid =puid;
}
}
Pagecount.java
@Document(collection="countlog")public class Pagecount implementsSerializable{/****/
private static final long serialVersionUID = 1L;
@IdprivateString id;privateString time;//private long fid;
List fid = new ArrayList();//private Integer pagenum;
List pagenum = new ArrayList();publicString getTime() {returntime;
}public voidsetTime(String time) {this.time =time;
}public ListgetFid() {returnfid;
}public void setFid(Listfid) {this.fid =fid;
}public ListgetPagenum() {returnpagenum;
}public void setPagenum(Listpagenum) {this.pagenum =pagenum;
}
}
2、查询示例代码
接口:
/*** 得到时间区间内的统计数据
*@parambeginDate
*@paramendDate
*@return
*/
public longgetInterviewNum(String beginDate, String endDate);
/*** 得到时间区间内根据fid排序的统计数据list
*@parambeginDate
*@return
*/
public List getPageGroup(String beginDate);
接口实现:
@Override
@Path("getInterviewNum")
@GET
@Produces({"application/json; charset=UTF-8"})public long getInterviewNum(@QueryParam("beginDate")String beginDate, @QueryParam("endDate")String endDate) {long Num=mongo.count(new Query(Criteria.where("time").gt(beginDate).lte(endDate)), Interview.class);returnNum;
}
@Override
@Path("getPageGroup")
@GET
@Produces({"application/json; charset=UTF-8"})public List getPageGroup(@QueryParam("beginDate")String beginDate) {
Criteria criatira= newCriteria();
criatira.andOperator(Criteria.where("time").is(beginDate));
List pagecount = new ArrayList();
String year= beginDate.substring(0,4);
String month=beginDate.substring(5);
mongo.getDb().eval("pagelog("+year+","+month+")");//mongo.getDb().eval("pagelog("+beginDate+")", pagecount);
pagecount= mongo.find(new Query(criatira).with(new Sort(new Order(Direction.DESC, "pagenum"))), Pagecount.class);returnpagecount;
}
控制层:
@Path("")public classInterviewController {
@Autowired
StatisticsService statisticsService;
@Post("/interview")
@Get("/interview")
@AdminLoginRequiredpublicString index(Invocation inv) {
Calendar c=Calendar.getInstance();
c.add(Calendar.MONTH,-1);
SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd");
String mDateTime=formatter.format(c.getTime());
inv.addModel("dateTime", new SimpleDateFormat("yyyy-MM-dd").format(newDate()));
inv.addModel("mDateTime", mDateTime);return "/views/statistics/interview.vm";
}
@Post("/getInterview")
@Get("/getInterview")public String getInterview(Invocation inv,@Param("beginDate")String beginDate,@Param("endDate")String endDate){long Num =statisticsService.getInterviewNum(beginDate, endDate);
inv.addModel("Num", Num);
JSONObject json= newJSONObject();
json.put("Num", Num);return "@"+json;
}
@Post("/interviewGroup")
@Get("/interviewGroup")
@AdminLoginRequiredpublicString indexGroup(Invocation inv) {
Calendar c=Calendar.getInstance();
c.add(Calendar.MONTH,-1);
SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM");
String mDateTime=formatter.format(c.getTime());
inv.addModel("mDateTime", mDateTime);return "/views/statistics/interviewGroup.vm";
}
@Post("/getPageGroup")
@Get("/getPageGroup")public String getPageGroup(Invocation inv,@Param("beginDate")String beginDate){
List Pagecount = new ArrayList();
Pagecount=statisticsService.getPageGroup(beginDate);
JSONObject json= newJSONObject();
json.put("list", Pagecount);return "@"+json;
}
}
3、mongoDB存储过程:
function(year,month){
var time=year+'-'+month;if(month<10){
time=year+'-0'+month;
}
var num=[];
var fid=[];
db.getCollection('pagelog').aggregate([ { $match : {'time':{$regex: "^" + time + ".*$"}} },{$group : { _id : "$fid", num : {$sum : 1}}}]).forEach(function(obj){
num.push(obj.num);
fid.push(obj._id);
})
document1=num;
document2=fid;
db.countlog.update({'time':time},{$set:{'fid':document2,'pagenum':document1,'time':time}},true,true);returntime;
}