如何聚合mongoDB中所有主题的标记

时间:2018-03-28 20:17:48

标签: node.js mongodb

我收集了以下数据

 {
                    "_id": "SG01",
                    "name": "Pawan",
                    "marks": [
                        {
                            "English": 93,
                            "Maths": 90,
                            "Hindi": 89,
                            "Sci": 98
                        }
                    ],
                    "__v": 0
                }

  {
                    "_id": "SG02",
                    "name": "Dravid",
                    "marks": [
                        {
                            "English": 40,
                            "Maths": 67,
                            "Hindi": 56,
                            "Sci": 45
                        }
                    ],
                    "__v": 0
                }
  {
                    "_id": "SG03",
                    "name": "Kartik",
                    "marks": [
                        {
                            "English": 65,
                            "Maths": 77,
                            "Hindi": 80,
                            "Sci": 79
                        }
                    ],
                    "__v": 0
                } 

我想执行marks应显示为特定学生total_marks的操作。 因为我是mongo的新手,知道如何使用sum执行基本聚合,但是无法理解数组..但是我尝试但未能得到结果。

1 个答案:

答案 0 :(得分:0)

您可以使用以下聚合:

db.col.aggregate([
    {
        $unwind: "$marks"
    },
    {
        $project: {
            _id: 1,
            name: 1,
            marks: {
                $objectToArray: "$marks"
            }
        }
    },
    {
        $project: {
            _id :1,
            name: 1,
            total_marks: {
                $reduce: {
                    input: "$marks",
                    initialValue: 0,
                    in: { $add : ["$$value", "$$this.v"] }
                }
            }
        }
    },
    {
        $group: {
            _id: "$_id",
            name: { $first: "$name" },
            total_marks: { $sum: "$total_marks" }
        }
    }
])

由于您的标记存储为对象,因此您应使用$objectToArray来获取一系列主题。然后,您可以使用$reduce对一名学生的所有科目求和。