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