我们一般通过表达式$sum来计算总和。因为MongoDB的文档有数组字段,所以可以简单的将计算总和分成两种:1,统计符合条件的所有文档的某个字段的总和;2,统计每个文档的数组字段里面的各个数据值的和。这两种情况都可以通过$sum表达式来完成。以上两种情况的聚合统计,分别对应与聚合框架中的 $group
操作步骤和 $project
操作步骤。
1.$group
直接看例子吧。
Case 1
测试集合mycol中的数据如下:
{ title: 'MongoDB Overview',description: MongoDB is no sql databaserunoob.comhttp://www.runoob.com['mongodb','database','NoSQL']100 },{ title: NoSQL OverviewNo sql database is very fast10Neo4j OverviewNeo4j is no sql databaseNeo4jhttp://www.neo4j.com'neo4j',1); font-weight: bold">750 }
现在我们通过以上集合计算每个作者所写的文章数,使用aggregate()计算
db.mycol.aggregate({$group : {_id : "$by_user",num_tutorial : {$sum : 1}}}])
查询结果如下:
/* 1 */ { "_id" : "Neo4j","num_tutorial" : 1 2 { "_id" : "runoob.com",1); font-weight: bold">2 }
Case 2
统计每个作者被like的总和,计算表达式:
db.mycol.aggregate(])
查询结果如下;
110 }
Case 3
上面例子有些简单,我们再丰富一下,测试集合sales的数据如下:
{ "_id" : 1,"item" : "abc","price" : 10,"quantity" : 2,"date" : ISODate("2014-01-01T08:00:00Z") } { "_id" : 20,1); font-weight: bold">02-03T09:3,"item" : "xyz",1); font-weight: bold">5,1); font-weight: bold">054,1)">-15T08:-15T09:05:00Z") }
需要完成的目标是,基于日期分组,统计每天的销售额,聚合公式为:
db.sales.aggregate( { $group: { _id: { day: { $dayOfYear: "$date"},year: { $year: "$date" } },totalAmount: { $sum: { $multiply: [ "$price","$quantity" } },count: { $sum: } } } ] )
查询结果是:
{ "_id" : { "day" : 46,"year" : 2014 },"totalAmount" : 150,1)">count" : } { "_id" : { "34,1); font-weight: bold">45,1); font-weight: bold">1 }
Case 4
上面的,可以看出$group,我们都使用了_id,使用了分组,那么如果,我们的需求不需要分组,应该怎么办呢?
例如。我们现在要统计sales集合中一共卖出了多少件商品。
如果直接去掉group 阶段的_id,如下:
{ $group: { totalAmount: { $sum: "$quantity" } } } )
则报错:
{ "message" : "a group specification must include an _id","ok" : 015955
我们还是需要添加上_id,但是可以添加个常量,及时根据常量分组,可以为 _id : "0" 可以是 _id : "a", _id : "b", 还可以使_id : "x", _id : "y" 等等。
。
例如:
db.sales.aggregate( { $group: { _id : "Total" totalAmount: { $sum: "$quantity" } } } )
查询结果为:
{ "_id" : "Total","totalAmount" : 28 }
2.$project阶段
Case 5
假设存在一个 students 集合,其数据结构如下:
{ "_id": 10,6,7 ],"labs": 5,8 80,"midterm": 75 } { "_id": 9,10 8,1); font-weight: bold">95,1); font-weight: bold">80 4,5,5 6,1); font-weight: bold">78,1); font-weight: bold">70 }
现在的需求是统计每个学生的 平常的测验分数总和、实验分数总和、期末其中分数总和。
db.students.aggregate( { $project: { quizTotal: { $sum: "$quizzes"},labTotal: { $sum: "$labs" },examTotal: { $sum: [ "$final","$midterm" } } } ])
其查询输出结果如下:
{ "_id" : 23,"labTotal" : 13,"examTotal" : 155 } { "_id" : 19,1); font-weight: bold">16,1); font-weight: bold">17514,1); font-weight: bold">11,1); font-weight: bold">148 }
参考文献:
https://www.runoob.com/mongodb/mongodb-aggregate.html
https://docs.mongodb.com/manual/reference/operator/aggregation/sum/index.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。