Полагаю, вы могли бы сделать что-то вроде следующего и просто передать массив для фильтрации полей:
var field = [ "FOO", "BAR" ];
db.test.aggregate([
{
$project:{
"values":{
$filter:{
input:{
"$objectToArray":"$$ROOT"
},
cond:{
$in:[
"$$this.k",
fields
]
}
}
}
}
},
{
$unwind:"$values"
},
{
$project:{
key:"$values.k",
values:{
"$sum":{
"$let":{
"vars":{
"item":{
"$objectToArray":"$values.v"
}
},
"in":"$$item.v"
}
}
}
}
}
]);
Который после выполнения даст следующий вывод:
{ "_id" : "123123123123", "key" : "FOO", "values" : 8 }
{ "_id" : "123123123123", "key" : "BAR", "values" : 7 }