我有以下 2 個模式,應該加入這些模式并進行以下計算。
a {
academic_year: { type:String}
}
b {
b1: {type:Number, default:0 },
b2: {type:Number, default:0 },
b3: [{
b3_1: {type:Number, default:0 },
b3_2: {type:Number, default:0 },
b3_3: {type:Number, default:0 }
}]
b4: {type:mongoose.Schema.ObjectId, ref: 'a'}
}
假設我們有下面的例子
a {
academic_year: "2021-2022"
_id:6345659fd06188306de0deae
}
b {
b1:1,
b2: 2,
b3: [
{ b3_1: 5, b3_2: 4, b3_3: 4, },
{ b3_1: 1, b3_2: 4, b3_3: 2 }
{ b3_1: 5, b3_2: 1, b3_3: 2 }
]
b4: "6345659fd06188306de0deae"
}
回傳的結果將低于為陣列內的每個物件添加欄位總計的位置,并且 bigtotal= b1 b2 總欄位的總和
c {
academic_year: "2021-2022",
b1:1,
b2: 2,
b3: [
{ b3_1: 5, b3_2: 4, b3_3: 4,total:13 },
{ b3_1: 1, b3_2: 4, b3_3: 2 ,total:7},
{ b3_1: 5, b3_2: 1, b3_3: 2,total:8 }
],
BigTotal:31,
}
我首先嘗試使用 unwind 為每個陣列物件添加一個總欄位,但我不知道如何在 $unwind 之前回傳。我認為這是一個復雜的聚合
uj5u.com熱心網友回復:
用于$reduce遍歷陣列并對 3 個欄位求和。執行另一個$sum和以獲得最終b1結果。b2BigTotal
db.b.aggregate([
{
"$addFields": {
"b3": {
"$map": {
"input": "$b3",
"as": "b",
"in": {
"$mergeObjects": [
"$$b",
{
total: {
$sum: [
"$$b.b3_1",
"$$b.b3_2",
"$$b.b3_3"
]
}
}
]
}
}
}
}
},
{
$addFields: {
BigTotal: {
$sum: [
"$b1",
"$b2",
{
"$reduce": {
"input": "$b3",
"initialValue": 0,
"in": {
$sum: [
"$$value",
"$$this.total"
]
}
}
}
]
}
}
},
{
"$lookup": {
"from": "a",
"localField": "b4",
"foreignField": "_id",
"as": "aLookup"
}
},
{
"$unwind": "$aLookup"
},
// data wrangling/cosmetics
{
"$replaceRoot": {
"newRoot": {
"$mergeObjects": [
"$$ROOT",
"$aLookup"
]
}
}
},
{
"$unset": [
"aLookup",
"b4"
]
}
])
蒙戈游樂場
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/530354.html
標籤:mongodb猫鼬mongodb查询nosql聚合框架
上一篇:聚合多個查找不回傳資料
