1. 程式人生 > >spring-data-mongodb 使用原生aggregate語句(更新中)

spring-data-mongodb 使用原生aggregate語句(更新中)

comm bject gre 大量 存儲過程 ODB 結果 查詢 方法

除了特殊註釋外,本文的測試結果均基於 spring-data-mongodb:1.10.6.RELEASE(spring-boot-starter:1.5.6.RELEASE),MongoDB 3.0.6


  考慮到大多數人都是來找答案的,所以先給出結論

// import org.springframework.data.mongodb.core.MongoTemplate;
mongoTemplate.getDb().doEval("db.user.aggregate([{$group:{_id:‘$name‘,count:{$sum:‘$age‘}}}])");

註意:

  1、mongo shell 使用js語法,可以使用單引號或者雙引號表示字符串,這裏使用單引號,可以避免大量的 \ 轉義符

  2、原生語句中的key:value部分,value只能是 [xxx] 、{xxx} 、 ‘xxx’ 三種格式的數據。

  新版本的spring-data-mongodb已經去掉了doEval方法,我們可以使用下面的方法自己拼接

//spring-boot-starter:2.1.0.RELEASE spring-data-mongodb:2.1.2.RELEASE
BasicDBObject bson = new BasicDBObject();
bson.put("$eval","db.user.aggregate([{$group:{_id:‘$name‘,count:{$sum:‘$age‘}}}])"
); Object object = mongoTemplate.getDb().runCommand(bson);

  其他的解決方法,如調用存儲過程、拼接完整的BasicDBObject、繼承Aggregate請見第三章:SPRING-DATA-MONGODB底層與MONGO-DRIVER的交互


  研究這個是因為遇到了一個業務需求,需要使用多種限制條件,返回多個統計字段。spring-data-mongodb提供的API不足以實現這麽復雜的業務,所以就想到了直接使用原生的aggregate查詢。

  mongo底層實現查詢的方法主要有兩種,一種是 db._collection_.doSomething({ ... }) ,另一種是db.runCommand({doSomething:_collection_ , ... }) ,我們將第一種稱作函數

,第二種稱作命令

  那麽,哪種才是 aggregate的原生查詢?spring-data-mongodb底層究竟調用的是函數還是命令?如果你只是想完成工作的話,copy上面的代碼,然後右上角點×,如果你想解決問題學點東西的話,歡迎繼續看下去


  一:spring-data-mongodb 使用原生aggregate語句

  二:mongo的runCommand與集合操作函數的關系

  三:spring-data-mongodb底層與mongo-driver的交互

  四:mongo中的特殊集合$cmd

spring-data-mongodb 使用原生aggregate語句(更新中)