我有 4 組球員統計資料:Laliga2017、Laliga2018、Laliga2019 和 Laliga2020
{
'_id': ObjectId('61eda25219e7e44801799d71'),
'name': 'Sergio Ramos',
'age': 34,
'nationality': 'Spain',
'height': 184,
'weight': 82,
'team': 'Real Madrid',
'position': 'DF',
'general_stats': {
'games': 15,
'time': 1280,
'red_cards': 0,
'yellow_cards': 3,
},
'offensive_stats': {
'goals': 2,
'xG': 3.95,
'assists': 0,
'xA': 0.4,
'shots': 17,
'key_passes': 4,
'npg': 0,
'npxG': 2.46,
'xGChain': 9.06,
'xGBuildup': 7.22,
},
'defensive_stats': {
'Tkl': 20,
'TklW': 12,
'Past': 8,
'Press': 97,
'Succ': 39,
'Blocks': 18,
'Int': 16,
},
'passing_stats': {
'Cmp': 1023,
'Cmp%': 91.8,
'1/3': 106,
'PPA': 2,
'CrsPA': 1,
'Prog': 61,
},
}
有沒有辦法獲得所有 4 年的所有目標貢獻(目標 助攻)的總和(對于每一年,然后是所有年份統計資料的總和)?
我到了這里:
db.LaLiga_2020.aggregate(
[
{ $match: { name: 'Lionel Messi' } },
{
$lookup: {
from: 'LaLiga_2019',
localField: 'name',
foreignField: 'name',
as: 'stats2019',
},
},
{
$lookup: {
from: 'LaLiga_2018',
localField: 'name',
foreignField: 'name',
as: 'stats2018',
},
},
{
$lookup: {
from: 'LaLiga_2017',
localField: 'name',
foreignField: 'name',
as: 'stats2017',
},
},
{
$project: {
_id: 0,
name: 1,
team: 1,
position: 1,
goal_cotribution_2020: { $add: ['$offensive_stats.goals', '$offensive_stats.assists'] },
goal_cotribution_2019: { $sum: ['$stats2019.offensive_stats.goals', '$stats2019.offensive_stats.assists'] },
goal_cotribution_2018: { $sum: ['$stats2018.offensive_stats.goals', '$stats2018.offensive_stats.assists'] },
goal_cotribution_2017: { $sum: ['$stats2017.offensive_stats.goals', '$stats2017.offensive_stats.assists'] },
},
},
],
).pretty();
但它回傳:
{
'name': 'Lionel Messi',
'team': 'Barcelona',
'position': 'FW',
'goal_cotribution_2020': 39,
'goal_cotribution_2019': 0,
'goal_cotribution_2018': 0,
'goal_cotribution_2017': 0,
};
uj5u.com熱心網友回復:
問題出在您的$project階段,特別是您如何$sum:
goal_cotribution_2018: {
$sum: [
"$stats2018.offensive_stats.goals",
"$stats2018.offensive_stats.assists"
]
}
問題是舞臺stats2018之后是一個陣列。$lookup所以"$stats2018.offensive_stats.goals"決議成一個數字陣列而不是一個數字,想象一下你在做什么是這樣的:
goal_cotribution_2018: {
$sum: [
[12],
[5]
]
}
因此,雖然沒有拋出錯誤,但這是未定義的行為,$sum只回傳 0。
您可以通過幾種不同的方式解決此問題。您可以$unwind或使用$arrayElemAt,但我認為“最干凈”的方法只是添加一個額外的嵌套$sum,如下所示:
goal_cotribution_2018: {
$sum: [
{
$sum: "$stats2019.offensive_stats.goals"
},
{
$sum: "$stats2019.offensive_stats.assists"
},
]
},
uj5u.com熱心網友回復:
最簡單的方法是在最后添加所有欄位應該可以
{
"$project":{
"_id":0,
"name":1,
"team":1,
"position":1,
"goal_cotribution_2020":{
"$add":[
"$offensive_stats.goals",
"$offensive_stats.assists"
]
},
"goal_cotribution_2019":{
"$add":[
"$stats2019.offensive_stats.goals",
"$stats2019.offensive_stats.assists"
]
},
"goal_cotribution_2018":{
"$add":[
"$stats2018.offensive_stats.goals",
"$stats2018.offensive_stats.assists"
]
},
"goal_cotribution_2017":{
"$add":[
"$stats2017.offensive_stats.goals",
"$stats2017.offensive_stats.assists"
]
},
"total_goal_cotribution":{
"$add":[
"$offensive_stats.goals",
"$offensive_stats.assists",
"$stats2019.offensive_stats.goals",
"$stats2019.offensive_stats.assists",
"$stats2018.offensive_stats.goals",
"$stats2018.offensive_stats.assists",
"$stats2017.offensive_stats.goals",
"$stats2017.offensive_stats.assists"
]
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/453620.html
上一篇:如何展平這個子檔案陣列?
