spring-data-mongodb 使用原生aggregate語句(更新中)
除了特殊註釋外,本文的測試結果均基於 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語句(更新中)