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);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章