Mongodb запрос $ agregate $ group $ count и другие друзья - PullRequest
0 голосов
/ 18 октября 2018

У меня в настоящее время есть такие записи в моей базе монго:

/* 1 */
{
    "_id" : ObjectId("5bc746282c9bf51af0ff8afb"),
    "horodate" : ISODate("2018-10-17T14:24:38.975Z"),
    "id_track" : 835,
    "type_cmd" : "F"
}

/* 2 */
{
    "_id" : ObjectId("5bc746282c9bf51af0ff8afb"),
    "horodate" : ISODate("2018-10-17T14:24:40.928Z"),
    "id_track" : 853,
    "type_cmd" : "R"
}

Я ищу среднее с запросом монго, чтобы получить ответ на этот буквальный запрос.

«type_cmd» может быть A, R, P, C, F

За период с вчерашнего дня с 3:00 до сегодняшнего дня 3.am для каждого «id_track» подсчитать, сколько записей, и подсчитать, сколько«type_cmd» для каждого типа «type_cmd».

Чтобы получить такой результат:

id_track     Nb_records    Type A     Type_R      Type_P     etc...
853          652           52         54          25         XX
842          52            6          7           15         XX
35           25            12         5           2          XX

Большое спасибо за помощь, я впервые работаю с такой базой данных.

В настоящее время я учусь делать запрос от mongoshell, но он очень сильно отличается от mysql.

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Большое спасибо за вашу помощь, но здесь результат, только одна запись и никаких следов id_track?

/* 1 */ {
    "_id" : "A",
    "type_cmd_count" : 92.0 }

/* 2 */ {
    "_id" : "F",
    "type_cmd_count" : 92.0 }

/* 3 */ {
    "_id" : "R",
    "type_cmd_count" : 91.0 }

/* 4 */ {
    "_id" : "P",
    "type_cmd_count" : 92.0 }

/* 5 */ {
    "_id" : "C",
    "type_cmd_count" : 92.0 }
0 голосов
/ 19 октября 2018

Надеюсь, это направит вас в правильном направлении.Вот агрегация, которая, как я полагаю, сблизит вас.Очевидно, вы бы заменили даты на yesterday at 3am и today at 3am.

Весь конвейер:

db.getCollection("test").aggregate(

    // Pipeline
    [
        // Find documents between yesterday @ 3am and today @ 3am
        {
            $match: {
            $and: [ { "horodate": { $gte: ISODate("2018-10-17T03:00:00.000+0000") } }, { "horodate": { $lte: ISODate("2018-10-18T03:00:00.000+0000") } } ] }
        },

        // Group documents by id_track and add type_cmd to array
        {
            $group: {
            _id: '$id_track',
            type_cmd: {$addToSet: "$type_cmd"}
            }
        },

        // Deconstruct the type_cmd array
        {
            $unwind: "$type_cmd"
        },

        // group by type_cmd and count the number of documents
        {
            $group: {
             _id: "$type_cmd", 
             type_cmd_count: { $sum:1} 
             }
        },

    ]

);

Вот результаты на каждом этапе, которые, как мы надеемся, помогут визуализировать происходящее.

Этап 2 - Группировка документов по id_track

{ 
    "_id" : 853.0, 
    "type_cmd" : [
        "R"
    ]
}
{ 
    "_id" : 835.0, 
    "type_cmd" : [
        "F"
    ]
}

Этап 3 - Деконструкция массива type_cmd

{ 
    "_id" : 853.0, 
    "type_cmd" : "R"
}
{ 
    "_id" : 835.0, 
    "type_cmd" : "F"
}

Этап 3 - Подсчет

{ 
    "_id" : "F", 
    "type_cmd_count" : 1.0
}
{ 
    "_id" : "R", 
    "type_cmd_count" : 1.0
}
...