我有这个“销售”系列,它的样本如下:

[
{cusID: 'a412q39x',
cusCountry: 'MEX',
itemPurchased: 'Toy_A'
},
{cusID: 'r760e11s',
cusCountry: 'USA',
itemPurchased: 'Toy_B'
},
{cusID: 'g723f01z',
cusCountry: 'USA',
itemPurchased: 'Toy_C'
},
{cusID: 'h277p01c',
cusCountry: 'CAN',
itemPurchased: 'Toy_B'
}
]

这是我希望达到的结果。
[
{item: 'Toy_A',
USA: 4,
MEX: 2,
CAN: 1,
BRA: 0
},
{item: 'Toy_B',
USA: 3,
MEX: 0,
CAN: 2,
BRA: 1
}
]

我试过:
{
$group:{_id:{toy:'$itemPurchased', country: $cusCountry'},'cnt':{'$sum': 1}}
}

结果不是我想要的。
[
{
_id.toy: 'Toy_A',
_id.country: 'BRA',
cnt: 43
},
{
_id.toy: 'Toy_A',
_id.country: 'USA',
cnt: 102
},
{
_id.toy: 'Toy_A',
_id.country: 'JPN',
cnt: 72
},
{
_id.toy: 'Toy_B',
_id.country: 'CAN',
cnt: 32
}
]

我也尝试过$facet,但没有效果。蒙古大师,请开导。提前谢谢。

最佳答案

尝试如下:

db.collection.aggregate([
    {
        $group: { _id: '$itemPurchased' ,  items: { $push: { "country" : "$cusCountry", "count": { $sum :1} } } }
    },
    {
        "$project": {
            "countryCounts": {
                "$arrayToObject": {
                    "$map": {
                        "input": "$items",
                        "as": "item",
                        "in": {
                            "k": "$$item.country",
                            "v": "$$item.count",
                        }
                    }
                }
            }

        }
    },
    { $replaceRoot: { newRoot:  { "$mergeObjects":[  "$countryCounts" , { "item":"$_id"} ] } } }
])

结果如下:
{
    "USA" : 1,
    "item" : "Toy_C"
},

/* 2 */
{
    "USA" : 1,
    "CAN" : 1,
    "item" : "Toy_B"
},

/* 3 */
{
    "MEX" : 1,
    "item" : "Toy_A"
}

09-25 19:24