Как получить процентное соотношение данных с группой по дате в MongoDB - PullRequest
1 голос
/ 30 января 2020

Как получить в процентах общее количество данных с группировкой по дате в MongoDB?

Пример ссылки: https://mongoplayground.net/p/aNND4EPQhcb

У меня есть некоторая структура сбора, подобная этой

{ 
    "_id" : ObjectId("5ccbb96706d1d47a4b2ced4b"), 
    "date" : "2019-05-03T10:39:53.108Z",  
    "id" : 166,   
    "update_at" : "2019-05-03T10:45:36.208Z",  
    "type" : "image"
}
{ 
    "_id" : ObjectId("5ccbb96706d1d47a4b2ced4c"), 
    "date" : "2019-05-03T10:39:53.133Z",  
    "id" : 166,   
    "update_at" : "2019-05-03T10:45:36.208Z", 
    "type" : "image"
}
{ 
    "_id" : ObjectId("5ccbb96706d1d47a4b2ced4d"), 
    "date" : "2019-05-03T10:39:53.180Z", 
    "id" : 166,  
    "update_at" : "2019-05-03T10:45:36.208Z", 
    "type" : "image"
}
{ 
    "_id" : ObjectId("5ccbb96706d1d47a4b2ced4e"), 
    "date" : "2019-05-03T10:39:53.218Z",  
    "id" : 166,  
    "update_at" : "2019-05-03T10:45:36.208Z",  
    "type" : "image"
}

И у меня есть запрос в mongodb, чтобы получить данные сбора, как получить процент от общего количества данных. в приведенном ниже примере запроса, чтобы получить данные:

db.name_collection.aggregate(
   [
        { "$match": {  
            "update_at": { "$gte": "2019-11-04T00:00:00.0Z", "$lt": "2019-11-06T00:00:00.0Z"},
             "id": { "$in": [166] } 
        } },  
        {
           "$group" : { 
               "_id": {
                       $substr: [ '$update_at', 0, 10 ] 
                },
               "count" : {
                   "$sum" : 1
               } 
           }
        },
        {
            "$project" : {
                "_id" : 0,
                "date" : "$_id",
                "count" : "$count" 
            }
        },
        {
            "$sort" : {
                "date" : 1
            }
        }
   ]
)

и этот ответ:

{ 
    "date" : "2019-11-04", 
    "count" : 39
},
{ 
    "date" : "2019-11-05", 
    "count" : 135
}

как получить общее процентное значение данных из подсчета ключей? пример ответа на это:

{ 
    "date" : "2019-11-04", 
    "count" : 39,
    "percentage" : "22%"
},
{ 
    "date" : "2019-11-05", 
    "count" : 135,
    "percentage" : "78%"
}

1 Ответ

0 голосов
/ 30 января 2020

Вы должны сгруппировать по null, чтобы получить total счетчик, а затем использовать $ map , чтобы вычислить процент. $ round будет полезным оператором в таком случае. Наконец, вы можете $ размотать и $ заменить Root, чтобы вернуть то же количество документов:

db.collection.aggregate([
    // previous aggregation steps
    {
        $group: {
            _id: null,
            total: { $sum: "$count" },
            docs: { $push: "$$ROOT" }
        }
    },
    {
        $project: {
            docs: {
                $map: {
                    input: "$docs",
                    in: {
                        date: "$$this.date",
                        count: "$$this.count",
                        percentage: { $concat: [ { $toString: { $round: { $multiply: [  { $divide: [ "$$this.count", "$total" ] }, 100 ] } } }, '%' ] }
                    }
                }
            }
        }
    },
    {
        $unwind: "$docs"
    },
    {
        $replaceRoot: { newRoot: "$docs" }
    }
])

Пн go Детская площадка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...