mongodb 统计某个字段的和

本贴最后更新于 1939 天前,其中的信息可能已经时过境迁

场景

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

  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    90 引用 • 59 回帖 • 1 关注
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    340 引用 • 708 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...