Mongodb spring的整合开发 权限认证 mongotemplate的group mapReduce开发


  【开发过程的随笔总结,欢迎您的点评,可以做到更加严谨

  前段时间因为写一个业务,对mysql的插入量非常大,在idea开发环境,使得idea一直爆出outofmemry提示,并导致old 区一直涨。使用Mongodb 作为存储后,不仅插入速度大大提升,idea会卡死的顽疾也解决了。 

  Mongodb 能够非常简单的整合进项目

  1 添加相应database的权限用户

  2 mongoFactory构造mogotemplate链接对象

  3 进行mongo的增删改查操作

  • Mongo 的用户管理(授权操作需要有用户)

  请参考下面mongo的用户管理 

  mongo用户管理 

  http://www.cnblogs.com/billerbird/p/5648428.html

  下面是我的整合过程

  • Mongo 与Spring的集成 配置文件bean.xml
<!-- mongodb -->
<bean id="mongodb" class="org.springframework.data.mongodb.core.MongoFactoryBean">
<property name="host" value="${mongodb.host}" />
<property name="port" value="${mongodb.port}" />
</bean>
<bean id="credentials" class="org.springframework.data.authentication.UserCredentials">
<constructor-arg name="username" value="${mongodb.username}"/>
<constructor-arg name="password" value="${mongodb.password}"/>
</bean>
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongo" ref="mongodb" />
<constructor-arg name="databaseName" value="${mongodb.databaseName}" />
<constructor-arg name="userCredentials" ref="credentials" />
</bean>

 

  • mongotemplate的增删该查过程
  • mongotemplate 增

@Autowired
private MongoTemplate mongoTemplate;

public void saveBatch(List<APIRequest> apiRequests) { mongoTemplate.insert(apiRequests, APIConstant.API_REQUEST_COLLECTION); }

 

  • mongotemplate  查

@Autowired
private MongoTemplate mongoTemplate;

    public List<APIRequest> getPricingRequest(String startDate, String endDate, String partnerId) { Date start = DateUtil.parse(startDate,"yyyy-MM-dd"); Date end = DateUtil.parse(endDate,"yyyy-MM-dd"); Query query = query(where("partnerId").is(partnerId)) .addCriteria(where("requestType").is("precisePricing")) .addCriteria(where("requestDate").gt(start).lte(end)); List<APIRequest> apiRequests = mongoTemplate.find(query, APIRequest.class, APIConstant.API_REQUEST_COLLECTION); System.out.println("MongoDB的数据" + apiRequests.size()); return apiRequests; }

 

  • mongotemplate  分页

@Autowired
private MongoTemplate mongoTemplate;

    /**分页查询 shopping数据**/
    public List<APIRequest> getAllAPIRequest(String startDate, String endDate, String partnerId, Integer skip, Integer limit) { Date start = DateUtil.parse(startDate,"yyyy-MM-dd"); Date end = DateUtil.parse(endDate,"yyyy-MM-dd"); Query query = query(where("partnerId").is(partnerId)) .addCriteria(where("requestType").is("shopping")) .addCriteria(where("requestDate").gt(start).lte(end)).skip(skip).limit(limit);
        List<APIRequest> apiRequests = mongoTemplate.find(query, APIRequest.class, APIConstant.API_REQUEST_COLLECTION); System.out.println("MongoDB的数据" + apiRequests.size()); return apiRequests; }
  • mongotemplate  group

@Autowired
private MongoTemplate mongoTemplate;

    /**group 查询不能超过20000**/
    public List<APIRequest> getAllAPIRequestByGroup(String startDate, String endDate, String partnerId) { Date start = DateUtil.parse(startDate,"yyyy-MM-dd"); Date end = DateUtil.parse(endDate,"yyyy-MM-dd"); String keys = "origin;destination;journeyType"; GroupBy groupBy = GroupBy.key(keys.split(";")).initialDocument("{requestCount:0}").reduceFunction("function(curr, result){result.requestCount+=curr.requestCount;}"); Criteria criteria = where("partnerId").is(partnerId).and("requestType").is("shopping").and("requestDate").gt(start).lte(end); GroupByResults<APIRequest> rst = mongoTemplate.group(criteria,APIConstant.API_REQUEST_COLLECTION,groupBy, APIRequest.class); System.out.println("have result"); return null; }

 

  • mongotemplate  mapReduce

@Autowired
private MongoTemplate mongoTemplate;

    /**map reduce**/
    public List<APIRequest> getShoppingByMapReduce(String startDate, String endDate, String partnerId) { Date start = DateUtil.parse(startDate,"yyyy-MM-dd"); Date end = DateUtil.parse(endDate,"yyyy-MM-dd"); String keys = "origin;destination;journeyType"; GroupBy groupBy = GroupBy.key(keys.split(";")).initialDocument("{requestCount:0}").reduceFunction("function(curr, result){result.requestCount+=curr.requestCount;}"); String mapFuntion = "function() { \n" +
                "emit(\n" +
                "{\"origin\":this.origin,\"destination\":this.destination,\"journeyType\":this.journeyType},\n" +
                " this.requestCount); \n" +
                "}"; String reductFunction = "function(key, values) { \n" +
                "   return Array.sum(values);\n" +
                "}"; Criteria criteria = where("partnerId").is(partnerId).and("requestType").is("shopping").and("requestDate").gt(start).lte(end); Query query = new Query(criteria); MapReduceOptions mrO=new MapReduceOptions(); mrO.outputCollection("map_reduce_result"); MapReduceResults<APIRequest> mapReduce = mongoTemplate.mapReduce(query,APIConstant.API_REQUEST_COLLECTION,mapFuntion,reductFunction,mrO,APIRequest.class); List<DBObject>  person_results = mongoTemplate.execute("map_reduce_result",new CollectionCallback<List<DBObject> >() { public List<DBObject> doInCollection(DBCollection collection) throws MongoException, DataAccessException { DBCursor dbCursor=collection.find(); return dbCursor.toArray(); } }); 
        List<APIRequest> apiRequests = new ArrayList<>(); for (DBObject dbObject : person_results) { APIRequest apiRequest = new APIRequest(); apiRequest.setRequestCount(((Double)dbObject.get("value")).intValue()); apiRequest.setOrigin((String) ((DBObject)dbObject.get("_id")).get("origin")); apiRequest.setDestination((String) ((DBObject)dbObject.get("_id")).get("destination")); apiRequest.setJourneyType((String) ((DBObject)dbObject.get("_id")).get("journeyType")); apiRequests.add(apiRequest); } System.out.println("map reduce的结果:"+person_results.size() +"  转换后的结果:"+apiRequests.size()); return apiRequests; }

 

  • mongotemplate  aggregate
aggregate 欢迎您贴代码


结束


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM