1. 什么是MongoDB
MongoDB是一款 NoSQL 数据库管理系统,采用文档型结构存储数据,构建在分布式文件系统上,以 C++ 语言编写,旨在为 Web 应用提供可扩展的高性能数据存储解决方案。
MongoDB 特点:
高性能,支持高并发读写
灵活的数据模型,支持文档式存储,数据灵活
强大的查询能力,支持多种条件查询和复杂查询
可扩展性好,可支持分布式部署和水平扩展
支持丰富的数据类型,如嵌套文档和数组
2. 数组对象求和方法
2.1 基本使用
在 MongoDB 中,可以使用 aggregate
方法对文档进行聚合操作,实现对数组对象内元素求和的功能,方法如下:
db.collection.aggregate([
{
$group: {
_id: null,
total: {
$sum: "$arrayFieldName.elementName"
}
}
}
])
arrayFieldName
代表包含数组的字段名称,elementName
代表数组中要求和的元素名称,total
代表求和后的结果。
例如,有如下文档:
{
"_id": 1,
"name": "小明",
"scores": [
{
"subject": "语文",
"score": 80
},
{
"subject": "数学",
"score": 90
},
{
"subject": "英语",
"score": 85
}
]
}
求 scores
数组中 score
字段的和,可使用以下聚合操作:
db.students.aggregate([
{
$group: {
_id: null,
totalScore: { $sum: "$scores.score" }
}
}
])
执行结果如下:
{
"_id": null,
"totalScore": 255
}
其中, _id
为分组条件,由于我们不需要按任何条件进行分组,因此设置为 null
。 totalScore
为求和后的结果。
2.2 按条件过滤
有时候,需要对数组中的元素进行过滤,只对满足一定条件的元素进行求和操作,可以使用 MongoDB 提供的 $match
过滤器。
例如,有如下文档:
{
"_id": 1,
"name": "小明",
"scores": [
{
"subject": "语文",
"score": 80
},
{
"subject": "数学",
"score": 90
},
{
"subject": "英语",
"score": 85
}
]
}
{
"_id": 2,
"name": "小红",
"scores": [
{
"subject": "语文",
"score": 70
},
{
"subject": "数学",
"score": 60
},
{
"subject": "英语",
"score": 75
}
]
}
现需对 name
字段为 小明
的文档中,scores
数组中 score
字段进行求和,可以使用以下聚合操作:
db.students.aggregate([
{
$match: { name: "小明" }
},
{
$group: {
_id: null,
totalScore: { $sum: "$scores.score" }
}
}
])
执行结果如下:
{
"_id": null,
"totalScore": 255
}
其中,$match
过滤器用于筛选 name
字段为 小明
的文档,只对符合条件的文档进行求和操作。
2.3 过滤并分组
除了对数组元素进行过滤操作外,还可以对文档进行分组操作对分组后的数组进行相应的聚合操作。
例如,有如下文档:
{
"_id": 1,
"name": "小明",
"scores": [
{
"subject": "语文",
"score": 80
},
{
"subject": "数学",
"score": 90
},
{
"subject": "英语",
"score": 85
}
]
}
{
"_id": 2,
"name": "小红",
"scores": [
{
"subject": "语文",
"score": 70
},
{
"subject": "数学",
"score": 60
},
{
"subject": "英语",
"score": 75
}
]
}
现需对 scores
数组中的数据按 subject
字段进行分组,并求出每个科目的总成绩,可以使用以下聚合操作:
db.students.aggregate([
{
$unwind: "$scores"
},
{
$group: {
_id: "$scores.subject",
totalScore: { $sum: "$scores.score" }
}
}
])
执行结果如下:
{
"_id": "数学",
"totalScore": 150
}
{
"_id": "英语",
"totalScore": 160
}
{
"_id": "语文",
"totalScore": 150
}
其中,$unwind
操作将 scores
数组展开成一个一个的文档,$group
操作将展开后的文档按照 subject
字段进行分组,并计算求和后的结果。
3. 总结
通过 aggregate
方法进行聚合操作,可以方便地实现对 MongoDB 中数组对象内元素求和的功能。此外, aggregate
方法还支持多种聚合操作,如计算平均值、最大值、最小值等,有助于更高效地进行数据统计和分析。