Mongodb 根据数组字段按计数分组

Mongodb Group by count Based on Array fields

我有以下数据。我想按数组中的字段分组。

{
    "_id" : ObjectId("54e73137758646882f445383"),
    "items" : [ 
    {
        "name" : "one",
        "quality" : "high"
    }, 
    {
        "name" : "one",
        "quality" : "low"
    }, 
    {
        "name" : "two",
        "quality" : "high"
    }
    ]
}

/* 1 */
{
    "_id" : ObjectId("54e73166758646882f445384"),
    "items" : [ 
    {
        "name" : "two",
        "quality" : "high"
    }, 
    {
        "name" : "three",
        "quality" : "low"
    }, 
    {
        "name" : "four",
        "quality" : "medium"
    }
    ]
}

我想按名称和质量分组,我想计数。

这是我试过的

db.testColl.aggregate( {$group : { 
            _id : {itemsName : "$items.name" ,itemsQuality : "$items.quality" },  
          count : {$sum : 1} 
    }})

我得到的结果像

{
    "result" : [ 
    {
        "_id" : {
            "itemsName" : [ 
                "two", 
                "three", 
                "four"
            ],
            "itemsQuality" : [ 
                "high", 
                "low", 
                "medium"
            ]
        },
        "count" : 1
    }, 
    {
        "_id" : {
            "itemsName" : [ 
                "one", 
                "one", 
                "two"
            ],
            "itemsQuality" : [ 
                "high", 
                "low", 
                "medium"
            ]
        },
        "count" : 1
    }
    ],
    "ok" : 1
}

预期结果:

{
"result" : [ 
    {
        "_id" : {
            "itemsName" : one,
            "itemsQuality" : high
        },
        "count" : 1
    },
       {
        "_id" : {
            "itemsName" : one,
            "itemsQuality" : low
        },
        "count" : 1
    },
    {
        "_id" : {
            "itemsName" : two,
            "itemsQuality" : high
        },
        "count" : 2
    },

    ....
    ],
    "ok" : 1
}

可能吗?如果是这样,请帮助我这样做? 如果不可能,请更正我的结构以获得结果。

试试这个会解决你的问题

db.collectionName.aggregate({
    "$unwind": "$items"
}, {
    "$group": {
    "_id": {
        "itemsName": "$items.name",
        "itemsQuality": "$items.quality"
    },
    "count": {
        "$sum": 1
    }
    }
})