首页 > 解决方案 > Mongodb查询$agregate $group $count等好友

问题描述

我目前在我的 mongo 基地中有这种记录:

/* 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"
}

我正在寻找一个 mongo 请求的平均值,以获得对这个乱七八糟的请求的答案。

“type_cmd”可以是 A、R、P、C、F

昨天凌晨3点到今天凌晨3点这段时间,对于每个“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 非常不同。

标签: mongodbmongodb-queryaggregation-framework

解决方案


我希望这能为您指明正确的方向。这是一个聚合,我相信它可以让你非常接近。您显然会用yesterday at 3amand替换日期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
}

推荐阅读