我想對studentMarkDetails陣列中所有科目的分數求和。我該怎么做?如果我使用它在studentMarkDetails陣列中,我會$unwind獲取 0 條記錄。
我需要這樣的輸出:
{
"_id": ObjectId("636efe231eeef2f46a31d7f4"),
"sName": "Somu",
"class": "tenth",
"year": 2003,
"examType": "quaterly",
"total_marks": 300
}
我的檔案是:
{
"_id": ObjectId("636efe231eeef2f46a31d7f4"),
"sName": "Somu",
"class": "tenth",
"year": 2003,
"studentMarkDetails": [
{
"examType": "quaterly",
"marks": {
"Eng": 55,
"Tel": 45,
"Mat": 75,
"Sec": 43,
"Soc": 65
}
},
{
"examType": "halfyearly",
"marks": {
"Eng": 56,
"Tel": 76,
"Mat": 89,
"Sec": 34,
"Soc": 76
}
},
{
"examType": "final",
"marks": {
"Eng": 89,
"Tel": 78,
"Mat": 91,
"Sec": 95,
"Soc": 87
}
}
]
}
uj5u.com熱心網友回復:
有幾種方法可以實作預期的輸出。解決方案的關鍵是您需要通過 將marks物件轉換為陣列$objectToArray,然后執行求和。
解決方案 1
$project-1.1。- 對結果1.1.1
$sum中的陣列值求和。1.1.1。
$map- 迭代陣列中的每個元素并生成一個新陣列。1.1.1.1。
input- 將marks物件轉換為物件陣列(形式:){ k: "Eng", v: 89 }。1.1.1.2。
in- 回傳v。
db.collection.aggregate([
{
$unwind: "$studentMarkDetails"
},
{
$project: {
"sName": 1,
"class": 1,
"year": 1,
"examType": "$studentMarkDetails.examType",
"total_marks": {
$sum: {
$map: {
input: {
$objectToArray: "$studentMarkDetails.marks"
},
in: "$$this.v"
}
}
}
}
}
])
演示解決方案 1 @ Mongo Playground
解決方案 2
您也可以使用$reducewhich 旨在將陣列轉換為新值。結果將與解決方案 1相同。
db.collection.aggregate([
{
$unwind: "$studentMarkDetails"
},
{
$project: {
"sName": 1,
"class": 1,
"year": 1,
"examType": "$studentMarkDetails.examType",
"total_marks": {
$reduce: {
input: {
$objectToArray: "$studentMarkDetails.marks"
},
initialValue: 0,
in: {
$sum: [
"$$value",
"$$this.v"
]
}
}
}
}
}
])
演示解決方案 2 @ Mongo Playground
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/532495.html
標籤:mongodbmongodb查询聚合框架总计的聚合函数
