mongodb 統計某個字段的和
場景
mongodb
作爲 noSQL
的文檔型數據庫, 裏面存儲的內容一般都是一個結構化的 json
格式文檔, 所以導致部分統計可能沒有直接寫個 sql
方便, 但是 mongodb
本身提供了很多強大的查詢功能, 使用得當的話可以獲得同樣的效果
mongodb 原生的統計方式
思路: 我們可以使用 $group
來聚合統計
db.yourCollection.aggregate( [
{
$group: {
_id: null,
total: { $sum: "$discountMoney" }
}
}
] );
這種方法能夠直接統計自己指定字段的和, 但是有個侷限性, 如果字段類型不全爲數字類型, 則統計數會有誤(例如字段類型全爲
string
的話直接爲0)
特殊統計方式
由於我這次遇到場景是需要統計非數字類型的和(實際上是將數值存成了string
), 所以上面的方法沒正確統計出來
搜索了很多資料大致思路是用 $project
將字段改成數值類型, 或者將數值插入個新字段然後再統計
感覺都太麻煩了, 我只是臨時想要知道一下某幾個字段之和
後來偶然看到一個用 js
循環將字段改成數值重新保存數據的方法, 我就想我都直接循環全部數據量, 循環過程中不就可以吧數據統計出來嗎, 於是有了下面的方式
思路: 查詢所有需要統計的文檔, 通過循環將需要計算的字段轉成數字並累加到 計數變量
中, 最後輸出 計數變量
// 統計數量(字符串類型)
var sTime = ISODate("2019-06-28 00:00:00.000Z");
var eTime = ISODate("2019-06-28 23:59:59.000Z");
var payPrice = 0;
var discount = 0;
var orderPrice = 0;
db.yourCollection.find({"orderTime":{$gte:sTime, $lt:eTime}}).forEach(
function(x) {
var temp1 = Number(x.payMoney) ;
var temp2 = Number(x.discountMoney) ;
var temp3 = Number(x.orderMoney) ;
payPrice = payPrice + temp1;
discount = discount + temp2;
orderPrice = orderPrice + temp3;
})
print(payPrice);
print(discount);
print(orderPrice);