mongodb按日期統計訂單數量時遇到的那些坑,你值得掌握

筆者不用 mongodb 有幾年時間了,最近有個項目使用的是 mongodb,但實際差不多是把它當做 mysql 在用,PS 不是我設計的。我臨時幫忙,做一個統計功能。大概的需求是:根據設置列出可預約的日期以及每天的可預約量以及已經預約的量。

查詢可預約日期以及每天的可預約量很簡單,一條查詢即可,但是,查詢每天的已經預約的數量就比較困難了,實際等於是按天統計訂單數量,mysql 可以使用 group by,mongodb 同樣可以,但是,筆者在使用 mongodb 實現聚合查找時卻遇到了一堆的坑,個個都是天坑。

mongodb按日期統計訂單數量時遇到的那些坑,你值得掌握

筆者的代碼大概是這樣寫的:

Criteria criteria = Criteria.where("orderInfo").
is(new DBRef("order_info", orderId))
.and("create_date").gte(beginDate).lte(endDate);
AggregationOperation match = Aggregation.match(criteria);

List<aggregationoperation> aggregationOperationList = new ArrayList<>();
aggregationOperationList.add(match);
aggregationOperationList.add(Aggregation.project("create_date")
.and(DateOperators.dateOf("create_date")
.toString("%Y-%m-%d")).as("createDate"));
aggregationOperationList.add(Aggregation.group("createDate").first("create_date")
.as("createDate").count().as("totalCount"));/<aggregationoperation>

return mongoTemplate.aggregate(Aggregation.newAggregation(aggregationOperationList),
"UserOrder.class", OrderAnalytics.class).getMappedResults();

但是,這段代碼卻有兩個坑,首先,mongodb 聚合查找不能使用class 名稱,即,最後一行不能使用 UserOrder.class,你應該使用 user_order,但是 mongodb 其他的查詢中,你完全可以使用 class 名稱。。。這簡直就是天坑,可能跟 mongodb 版本有關,具體原因實在沒空去深究。

如果你使用 class 名稱會拋出類似這樣的異常:org.springframework.data.mapping.PropertyReferenceException: No property userOrder found for type UserOrder!

下次你在遇到類似的錯誤時,優先考慮下,是否是因為你使用了 類名,而導致無法找到響應的表名呢?

第二個坑,即最開始哪行:

Criteria criteria = Criteria.where("orderInfo").
is(new DBRef("order_info", orderId))

這裡,你不應該直接使用 orderId,而應該使用 new ObjectId(orderId) 否則啥數據都查不到,但是在 query 中,你可以直接使用 orderId,而無需使用ObjectId 包裹。


這次的分享到此就結束了,關注我,帶你一起踏平 bug。全棧之旅 - 分享編程經驗與Linux技術,從不玩關注+私信那套。如果有用,記得收藏+分享哦。


分享到:


相關文章: