MongoDB 计算嵌入文档/数组中字段的平均值

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中进行聚合计算有所帮助!

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程