Мне нужно сгруппировать по полю x и получить максимальное значение других полей. Да, используя $max
, мы можем получить максимальное повторяющееся значение. Но мне также нужно получить значение count $max
в процентах / счет. Другими словами, сколько раз это значение $max
существует в этой группе. Пожалуйста, помогите.
пример:
db.getCollection("test").aggregate(
[
{ "$match" : { "doc_id" : 1.0 } },
{ "$group" : {
"_id" : { "name" : "$name" },
"total" : { "$sum" : "$amount" },
"l1_max" : { "$max" : "$l1" }
}
},
]
);
Здесь я получаю l1_max = 'Computer'
. Но мне нужно это как 'Computer - (30%) Total 4/12'
Обновлено : 20/10/2019 @mickl: Спасибо за ответ.
Поле l1 на самом деле является ссылочным полем. В обычном find / project или mongoose populate (), это помогает получить поля из другой коллекции. Пример: если l1 имеет тип ObjectId, то
l1: {
_id, "4343434343sdsdsY",
name: "IT"
}
Таким образом, l1.name извлечет поле имени из другой коллекции в функции проекта / заполнения.
Я выполнил следующий код:
db.getCollection("test").aggregate(
[
{ "$match" : { "doc_id" : 1.0 } },
{ "$group" : {
"_id" : { "name" : "$name" },
"total" : { "$sum" : "$amount" },
"count": { '$sum': 1 },
"l1_max" : { "$max" : "$l1" },
"l1_values": { $push: "$l1" }
}
},
{
$project: {
_id: 1,
total: 1,
l1 : {"_id": "$l1_max", "count": "$count", "percent": { $divide: [ { $size: { $filter: { input: "$l1_values", cond: { $eq: [ "$$this", "$l1_max" ] } } } },"$count"]}}
}
}
]
);
Ответ, как показано ниже: Но мне также нужно указать поле name .
{
"_id" : {
"name" : "xzy"
},
"total" : 35.0,
"l1" : {
"_id" : "4343920239201W",
"name" : "IT", // **MISSING**
"count" : 4.0,
"percent" : 0.25
}
}
Надеюсь, на этот раз все прояснилось.