MongoDB聚合,不同的几个字段并计算它们

时间:2018-04-17 13:56:10

标签: mongodb aggregation-framework

我能描述我想要实现的目标的最好方法是使用一个例子。基本上我会有一个汽车列表说:

[
    {
        _id: 1,
        make: 'Toyota',
        model: 'Prius'
    },
    {
        _id: 2,
        make: 'Toyota',
        model: 'Prius'
    },
    {
        _id: 3,
        make: 'Toyota',
        model: 'Yaris'
    },
    {
        _id: 4,
        make: 'Lexus',
        model: 'RX400'
    }
]

现在我想通过makemodel(以及可能更多的字段)对它们进行分组/区分并计算总数。最终结果应该类似于:

{
    makes: [
        {
            name: 'Toyota',
            total: 3
        }, {
            name: 'Lexus',
            total: 1
        }
    ],
    models: [
        {
            name: 'Prius',
            total: 2
        },
        {
            name: 'Yaris',
            total: 1
        },
        {
            name: 'RX400',
            total: 1
        }
    ]
}

我完全坚持这个。到目前为止,我能实现这一目标的唯一方法是为每个字段调用几个异步聚合调用。但是,我更愿意在单个聚合调用中执行此操作,如果可能的话(除非性能不是很好)。

1 个答案:

答案 0 :(得分:2)

使用 $facet

db.collection.aggregate([
    { "$facet": {
        "makes": [
            { "$group": {
                "_id": "$make",
                "total": { "$sum": 1 }
            } },
            { "$project": {
                "_id": 0,
                "name": "$_id",
                "total": 1
            } }  
        ],
        "models": [
            { "$group": {
                "_id": "$model",
                "total": { "$sum": 1 }
            } },
            { "$project": {
                "_id": 0,
                "name": "$_id",
                "total": 1
            } }  
        ]
    } }
])