MongoDB 计算嵌入文档/数组中字段的平均值
在本文中,我们将介绍如何在MongoDB中计算嵌入文档或数组中字段的平均值。MongoDB是一个强大的文档数据库,它支持各种灵活的查询操作,包括对嵌入文档或数组中的字段进行聚合计算。
阅读更多:MongoDB 教程
首先,让我们创建一个示例集合和嵌入文档/数组
为了演示计算嵌入文档或数组中字段的平均值,我们首先需要创建一个示例集合,其中包含一些包含嵌入文档或数组的文档。假设我们正在创建一个名为”users”的集合,其中包含用户的姓名和他们的考试成绩。每个用户的考试成绩被嵌入在一个名为”exams”的数组中,每个考试成绩都包含科目名和分数。
下面是一个示例文档的结构:
{
"_id": ObjectId("609a0b8f746e486f39ad67f5"),
"name": "张三",
"exams": [
{
"subject": "数学",
"score": 85
},
{
"subject": "英语",
"score": 90
},
{
"subject": "物理",
"score": 75
}
]
}
使用聚合管道计算平均值
要计算嵌入文档/数组中字段的平均值,我们可以使用MongoDB的聚合管道操作符。下面是一个示例聚合管道,用于计算所有用户的数学成绩的平均分数:
db.users.aggregate([
{
unwind: "exams" // 展开嵌入的数组
},
{
match: {
"exams.subject": "数学" // 选择特定科目
}
},
{group: {
_id: null,
averageScore: { avg: "exams.score" } // 计算平均值
}
}
])
在上面的聚合管道中,我们首先使用$unwind
操作符展开了嵌入在”exams”数组中的文档。然后,使用$match
操作符选择了所有科目为”数学”的考试成绩。最后,使用$group
操作符计算了平均分数,使用$avg
操作符指定了要计算平均值的字段。
示例解释
让我们根据上述示例聚合管道来解释一下计算嵌入文档/数组中字段平均值的过程。
假设我们有一组文档如下:
{
"_id": ObjectId("609a0b8f746e486f39ad67f5"),
"name": "张三",
"exams": [
{
"subject": "数学",
"score": 85
},
{
"subject": "英语",
"score": 90
},
{
"subject": "物理",
"score": 75
}
]
},
{
"_id": ObjectId("609a0b8f746e486f39ad67f6"),
"name": "李四",
"exams": [
{
"subject": "数学",
"score": 95
},
{
"subject": "英语",
"score": 80
},
{
"subject": "物理",
"score": 70
}
]
}
在使用上述聚合管道时,首先使用$unwind
操作符展开了每个文档中的”exams”数组,将其拆分成多个文档。这将得到以下结果:
{
"_id": ObjectId("609a0b8f746e486f39ad67f5"),
"name": "张三",
"exam": {
"subject": "数学",
"score": 85
}
},
{
"_id": ObjectId("609a0b8f746e486f39ad67f5"),
"name": "张三",
"exam": {
"subject": "英语",
"score": 90
}
},
{
"_id": ObjectId("609a0b8f746e486f39ad67f5"),
"name": "张三",
"exam": {
"subject": "物理",
"score": 75
}
},
{
"_id": ObjectId("609a0b8f746e486f39ad67f6"),
"name": "李四",
"exam": {
"subject": "数学",
"score": 95
}
},
{
"_id": ObjectId("609a0b8f746e486f39ad67f6"),
"name": "李四",
"exam": {
"subject": "英语",
"score": 80
}
},
{
"_id": ObjectId("609a0b8f746e486f39ad67f6"),
"name": "李四",
"exam": {
"subject": "物理",
"score": 70
}
}
接下来,使用$match
操作符选择了所有科目为”数学”的考试成绩,得到以下结果:
{
"_id": ObjectId("609a0b8f746e486f39ad67f5"),
"name": "张三",
"exam": {
"subject": "数学",
"score": 85
}
},
{
"_id": ObjectId("609a0b8f746e486f39ad67f6"),
"name": "李四",
"exam": {
"subject": "数学",
"score": 95
}
}
最后,使用$group
操作符计算了平均分数,并将结果返回。在这种情况下,平均分数为(85 + 95)/ 2 = 90。
总结
本文介绍了如何在MongoDB中计算嵌入文档或数组中字段的平均值。我们演示了使用聚合管道进行此计算的示例,并详细解释了示例中使用的各个聚合操作符的作用。
计算嵌入文档/数组中字段的平均值在实际应用中非常有用,特别是在处理包含大量嵌入数据的文档时。希望本文对你在MongoDB中进行聚合计算有所帮助!