涉及到的代碼如下:
List<AggregationOperation> operations = new ArrayList<AggregationOperation>();
operations.add(
Aggregation.project().andExpression("substr(startTime,0,10)").as("day")
);
operations.add(
Aggregation.group("day")
.sum("$duration").as("totalDuration")
);
operations.add(
Aggregation.match(
Criteria.where("ccId").is(ccId)
.and("startTime").gte(dateFrom).lte(dateTo)
)
);
operations.add(
Aggregation.sort(Sort.Direction.ASC, "_id") // 按日期升序排序
);
Aggregation aggregation = Aggregation.newAggregation(operations);
AggregationResults<BasicDBObject> results = mongoTemplate.aggregate(
aggregation, "t_call_record", BasicDBObject.class);
List<BasicDBObject> mappedResults = results.getMappedResults();
斷點除錯,執行到
AggregationResults<BasicDBObject> results = mongoTemplate.aggregate(
aggregation, "t_call_record", BasicDBObject.class);
代碼時就報錯了,提示:
java.lang.IllegalArgumentException: Invalid reference '$duration'!
“duration”在mongodb中是集合的一個key,業務需求是按日統計duration key對應value的累加值。
我在另一個業務方法里將Aggregation.project() 和 Aggregation.group("day") .count().as("totalCnt")一起用來統計次數都沒有報錯,心想同樣是聚合行數,sum()和count()的用法應該是差不多的。在我多次嘗試后,發現如果洗掉
operations.add(
Aggregation.group("day")
.sum("$duration").as("totalDuration")
);
這段代碼,錯誤就不會報了,但也不符合我的業務邏輯。
所以就想請教各位大神,在springboot中使用mongoTemplate相關語法進行mongodb的互動操作時,若想Aggregation.project() 與 Aggregation.group().sum()聯合使用,是否還有其他條件限制或語法規范?謝謝!
uj5u.com熱心網友回復:
自己頂下,不要這么快沉啊uj5u.com熱心網友回復:
$duration 表示的是一個變數啊直接用duration
uj5u.com熱心網友回復:
operations.add(Aggregation.project("duration").andExpression("substr(startTime,0,10)").as("day")
);
operations.add(
Aggregation.group("day")
.sum("duration").as("totalDuration")
);
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/80816.html
標籤:MongoDB
上一篇:用mysql創建用戶
下一篇:mysql陳述句優化
