如何在MongoDB上进行数据透视?

时间:2019-04-03 03:47:15

标签: database mongodb nosql aggregation-framework

我有这个“销售”收藏,并且它的示例如下:

[
{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,但无济于事。蒙哥大师,请赐教。预先感谢。

1 个答案:

答案 0 :(得分:0)

尝试如下:

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