mongodb aggregate 實踐
這段時間公司的專案業務改動,原來用的資料庫是mysql,最近打算把部分業務相關的資料存在mongodb,我需要做的工作,第一點是資料遷移,在這裡就不說了,寫段小程式就遷移過去了,然後還要把這塊業務的資料訪問層,重寫一版mongodb的實現。
下面分別是mysql和mongodb不同實現的查詢,統計某一天內,賬單型別為1010(業務含義就不說了),累積賬單金額大於10000的使用者
mysql:
SELECT pl.user_id, IFNULL(round(sum(pl.amount), 2), 0) sum_amount
FROM ys_profit_log pl
WHERE pl.profit_type = 1010
AND pl.is_profit = 0
AND DATE_FORMAT(pl.create_time, '%Y-%m-%d') = DATE_SUB('2017-02-05', interval 1 DAY)
GROUP BY pl.user_id
HAVING sum_amount >= 10000;
mongodb:
db.ys_profit_log.aggregate([
{$match: {
profit_type: 1010,
is_profit: false,
create_time: {$gte: new Date('2017-02-04'), $lt: new Date('2017-02-05')}
}},
{$group: {_id: '$user_id', sum_amount: {$sum: '$amount'}}},
{$sort : {_id: 1}},
{$match: {sum_amount: {$gte: 10000}}}
]);
需要說明的一點,mongodb分組查詢後,不會像mysql一樣預設按分組的列進行升序排序,為了保證和之前mysql的實現一樣,這裡用$sort在分組後又進行了排序
Spring data mongodb 實現程式碼片段
package cn.yskj.timer.dao.impl;
import cn.yskj.common.constant.Constant;
import cn.yskj.common.constant.ProfitLogEnum;
import com.mongodb.BasicDBObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.*;
import org.springframework.data.mongodb.core.query.Criteria;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* 功能描述: 賬單
*
* 作者: Yzw
* 日期: 2017-04-06 10:27:28
*/
public class ProfitLogDaoImpl {
private static final Logger log = LoggerFactory.getLogger(ProfitLogDaoImpl.class);
@Autowired
private MongoTemplate mongoTemplate;
public List<Long> getXLGBUserIds(Map<String, Date> dateLimit) {
List<Long> userIdList = new ArrayList<>();
Date beginDate = dateLimit.get("begin");
Date endDate = dateLimit.get("end");
Criteria where = new Criteria();
where.and("profit_type").is(ProfitLogEnum.PROFIT_1010.getProfitType());
where.and("is_profit").is(false);
where.and("create_time").gte(beginDate).lt(endDate);
Criteria having = new Criteria();
having.and("sum_amount").gte(Constant.LGB_REQUIRE_NUM);
Aggregation aggr = Aggregation.newAggregation(
Aggregation.match(where),
Aggregation.group("user_id").sum("amount").as("sum_amount"),
Aggregation.sort(new Sort("_id")),
Aggregation.match(having)
);
AggregationResults<BasicDBObject> aggrResults = mongoTemplate.aggregate(aggr, "ys_profit_log", BasicDBObject.class);
List<BasicDBObject> mappedResults = aggrResults.getMappedResults();
if (mappedResults != null && mappedResults.size() > 0) {
log.info("查詢結果 => 使用者數量: {}", mappedResults.size());
mappedResults.forEach(item -> {
userIdList.add(item.getLong("_id"));
});
}
return userIdList;
}
}
相關文章
- 實戰 MongoDB AggregateMongoDB
- MongoDB:aggregate與aggregateCursorMongoDB
- MongoDB 最佳實踐MongoDB
- MongoDB最佳實踐MongoDB
- MongoDB aggregate效能優化與排序MongoDB優化排序
- MongoDB最佳安全實踐MongoDB
- MongoDB副本集實踐MongoDB
- 【MongoDB】 MongoDB 3.2.x 安裝實踐MongoDB
- MongoDB aggregate做統計資料(group進階)。MongoDB
- MongoDB 整合SpringBoot實踐MongoDBSpring Boot
- MongoDB Replica Set 副本集實踐MongoDB
- MongoDB 在評論中臺的實踐MongoDB
- MongoDB——簡單增、刪、改、查實踐MongoDB
- Koa2+MongoDB+JWT實戰--Restful API最佳實踐MongoDBJWTRESTAPI
- MongoDB 最佳實踐和場景避坑指南MongoDB
- 【最佳實踐】MongoDB匯出匯入資料MongoDB
- Spring Boot + MongoDB 應用的 Docker 化實踐Spring BootMongoDBDocker
- postgresql 自定義aggregate function實現reduceSQLFunction
- Flink CDC MongoDB Connector 的實現原理和使用實踐MongoDB
- mongodb原始碼實現、調優、最佳實踐系列-數百萬行mongodb核心原始碼閱讀經驗分享MongoDB原始碼
- Node.js 服務連線 MongoDB 處理最佳實踐Node.jsMongoDB
- 開放出版:潘凡《MongoDB開發與運維實踐》MongoDB運維
- MongoDB Page Fault 的發現與解決、騰訊雲 MongoDB 智慧診斷及優化實踐MongoDB優化
- mongodb核心原始碼實現、效能調優、最佳運維實踐系列-mongodb網路傳輸層模組原始碼實現三MongoDB原始碼運維
- 直播分享| 騰訊雲 MongoDB 智慧診斷及效能優化實踐MongoDB優化
- spark aggregate函式Spark函式
- Flink CDC 系列 - Flink MongoDB CDC 在 XTransfer 的生產實踐MongoDB
- 【mongodb】mongodb 實現主從複製MongoDB
- mongodb核心原始碼實現及效能最佳化系列:Mongodb特定場景效能數十倍提升最佳化實踐MongoDB原始碼
- mongo聚合框架aggregate使用Go框架
- 記某百億級mongodb叢集資料過期效能優化實踐MongoDB優化
- CSDN周賽第48期:贏《MongoDB核心原理與實踐》和定製周邊MongoDB
- Flink MongoDB CDC 在 XTransfer 的生產實踐|Flink CDC 專題MongoDB
- CSDN周賽第34期:贏《MongoDB核心原理與實踐》和定製周邊MongoDB
- Mongodb特定場景效能數十倍提升優化實踐(記一次mongodb核心叢集雪崩故障)MongoDB優化
- Mongodb特定場景效能數十倍提升最佳化實踐(記一次mongodb核心叢集雪崩故障)MongoDB
- 【TUNE_ORACLE】PGA_AGGREGATE_LIMIT詳解(一)PGA_AGGREGATE_TARGET的限制OracleMIT
- 【TUNE_ORACLE】PGA_AGGREGATE_LIMIT詳解(二)PGA_AGGREGATE_LIMIT的作用OracleMIT