在MongoDB组之后,选择每个字段的前3个

时间:2019-01-27 12:18:03

标签: mongodb mongodb-query aggregation-framework

我有一个包含“ servicereqesttype”,“邮政编码”,“日期”等字段的集合

我想在特定的一天为每个邮政编码提供3种最常见的“ servicerequesttype”。

db.event.aggregate([
{
    $match: {
        creationdate: "2011-01-01"
    }
},
{
    $project: {
        zipcode: "$zipcode",
        servicerequesttype: "$servicerequesttype"
    }
},
{
    $group: {
        _id: {
            zipcode: "$zipcode",
            servicerequesttype: "$servicerequesttype"
        },
        zipcode: {
            $first: "$zipcode"
        },
        servicerequesttype: {
            $first: "$servicerequesttype"
        },
        count: {$sum: 1}
    }
},
{
    $sort: {
        "zipcode": -1,
        "count": -1
    }
},
{
    $project: {
        _id: 0,
        zipcode: "$zipcode",
        servicerequesttype: "$servicerequesttype",
        count: "$count"
    }
}
])       

现在我要做的就是每个邮政编码仅选择3个,我需要一些帮助,也许我必须使用$ bucket或$ map ...

1 个答案:

答案 0 :(得分:0)

db.event.aggregate([
{
    $match: {
        creationdate: "2011-01-01"
    }
},
{
    $project: {
        zipcode: "$zipcode",
        servicerequesttype: "$servicerequesttype"
    }
},
{
    $group: {
        _id: {
            zipcode: "$zipcode",
            servicerequesttype: "$servicerequesttype"
        },
        zipcode: {
            $first: "$zipcode"
        },
        servicerequesttype: {
            $first: "$servicerequesttype"
        },
        count: {$sum: 1}
    }
},
{
    $sort: {
        "zipcode": -1,
        "count": -1
    }
},
{
    $project: {
        _id: 0,
        zipcode: "$zipcode",
        servicerequesttype: "$servicerequesttype",
        count: "$count",
        arrayOfTypes: "$array1",
        arrayOfIncidents: "$array2"
    }
},
{
    $group: {
        _id: "$zipcode",
        arrayOfTypes: {
            $push: {type: "$servicerequesttype", count: "$count"}
        }
    }
},
{
    $project: {
        _id: "$_id",
        array: {
            $slice: ["$arrayOfTypes", 3]
        }
    }
},
{
    $sort: {
        "_id": -1
    }
}
])