Mongodb Group, получая $ max и количество max в значении и процентах от этой группы - PullRequest
1 голос
/ 19 октября 2019

Мне нужно сгруппировать по полю 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
    }
}

Надеюсь, на этот раз все прояснилось.

1 Ответ

1 голос
/ 19 октября 2019

Вам необходимо собрать все значения l1 в вашей группе и вычислить процент с использованием $ деления , $ фильтра и $ размера :

db.getCollection("test").aggregate(
    [
        { "$match" : { "doc_id" : 1.0 } }, 
        { "$group" : {
                "_id" : { "name" : "$name" }, 
                "total" : { "$sum" : "$amount" }, 
                "l1_max" : { "$max" : "$l1" },
                "l1_values": { $push: "$l1" }
            }
        },
        {
            $project: {
                _id: 1,
                total: 1,
                l1_max: 1,
                l1_perc: { 
                    $divide: [
                        { $size: { $filter: { input: "$l1_values", cond: { $eq: [ "$$this", "$l1_max" ] } } } },
                        { $size: "$l1_values" }
                    ]
                }
            }
        }
    ]
);

Детская площадка Монго

...