Это еще один подход к получению результата:
- Получить имена полей документа и их значения
- Найти максимальное значение для полей с именами в
[ "htmlWordCount", "textWordCount", "rchilliTextWordCount" ]
.
Как правило, поиск максимального значения из массива является своего рода сокращением ;поэтому я использовал $reduce
в этом случае. Обратите внимание, что код проще. Если вы хотите добавить другое поле для расчета максимума, просто добавьте его в массив.
db.winner.aggregate([
{ $match: { country: "US"} },
{ $addFields: { fieldNameValues: { "$objectToArray": "$$ROOT" } } },
{ $project: { _id: 1, country: 1, fullName: 1, htmlWordCount: 1, textWordCount: 1, rchilliTextWordCount: 1,
winner: {
$reduce: {
input: "$fieldNameValues",
initialValue: { },
in: {
$cond: [
{ $and: [
{ $in: [ "$$this.k", [ "htmlWordCount", "textWordCount", "rchilliTextWordCount" ] ] },
{ $gt: [ "$$this.v", "$$value.v"] } ]
},
"$$this",
"$$value"
]
}
}
}
} },
{ $addFields: { winner: "$winner.k" } }
] )
[EDIT ADD] Пример данных и результат:
{
"_id" : 1,
"fileId" : "dd386cf7-4139-45c2-9853-cbb126621b51",
"job" : { },
"country" : "US",
"fullName" : "abcd xyz",
"htmlWordCount" : 2766,
"textWordCount" : 1867,
"rchilliTextWordCount" : 2840
}
{
"_id" : 2,
"fileId" : "dd386cf7-4139-45c2-9853-cbb126621b51",
"job" : { },
"country" : "US",
"fullName" : "lmn opqrs",
"htmlWordCount" : 5,
"textWordCount" : 9,
"rchilliTextWordCount" : 2
}
Выход:
{
"_id" : 1,
"country" : "US",
"fullName" : "abcd xyz",
"htmlWordCount" : 2766,
"textWordCount" : 1867,
"rchilliTextWordCount" : 2840,
"winner" : "rchilliTextWordCount"
}
{
"_id" : 2,
"country" : "US",
"fullName" : "lmn opqrs",
"htmlWordCount" : 5,
"textWordCount" : 9,
"rchilliTextWordCount" : 2,
"winner" : "textWordCount"
}