如何使用mongoose聚合函数计算每个评级

时间:2016-01-06 07:27:58

标签: node.js mongodb mongoose

如何使用猫鼬聚合函数根据每个评级计算评分计数?我有以下集合:

[

{
    "ProjectName":"AAA",
    "Emp":[
        {
            "Emp":{
                "EmpID":"1",
                "Rating":2.5
            }
        },
        {
            "Emp":{
                "EmpID":"2",
                "Rating":2
            }
        },
        {
            "Emp":{
                "EmpID":"2",
                "Rating":2.5
            }
        }
    ]
},
{
    "ProjectName":"BBB",
    "Emp":[
        {
            "Emp":{
                "EmpID":"1",
                "Rating":3
            }
        },
        {
            "Emp":{
                "EmpID":"1",
                "Rating":4
            }
        },
        {
            "Emp":{
                "EmpID":"2",
                "Rating":4
            }
        }
    ]
},
{
    ..
}

我期待以下回复:

[{

    "projectName":"AAA",
    "Rating":[
        {
            "Rate":0.5,
            "Count":0
        },
        {
            "Rate":1,
            "Count":0,
            "Percentage":0
        },
        {
            "Rate":1.5,
            "Count":0
        },
        {
            "Rate":2,
            "Count":0
        },
        {
            "Rate":2.5,
            "Count":0
        },
        {
            "Rate":3,
            "Count":1
        },
        {
            "Rate":3.5,
            "Count":0
        },
        {
            "Rate":4,
            "Count":2
        },
        {
            "Rate":4.5,
            "Count":0
        },
        {
            "Rate":5,
            "Count":0
        }
    ]
},
{
    "projectName":"BBB",
    "Rating":[
        {
            "Rate":0.5,
            "Count":0
        },
        {
            "Rate":1,
            "Count":0,
            "Percentage":0
        },
        {
            "Rate":1.5,
            "Count":0
        },
        {
            "Rate":2,
            "Count":1
        },
        {
            "Rate":2.5,
            "Count":2
        },
        {
            "Rate":3,
            "Count":0
        },
        {
            "Rate":3.5,
            "Count":0
        },
        {
            "Rate":4,
            "Count":0
        },
        {
            "Rate":4.5,
            "Count":0
        },
        {
            "Rate":5,
            "Count":0
        }
    ]

},{...}]

我能解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

使用以下聚合管道:

var pipeline = [
    { "$unwind": "$Emp" },
    {
        "$group": {
            "_id": {
                "projectName": "$ProjectName",
                "rate": "$Emp.Emp.Rating"
            },
            "count": { "$sum": 1 }
        }
    },
    {
        "$group": {
            "_id": "$_id.projectName",
            "Rating": { 
                "$push": {
                    "Rate": "$_id.rate",
                    "Count": "$count"
                }
            }
        }
    },
    {
        "$project": {
            "_id": 0, "projectName": "$_id", "Rating": 1
        }
    }
];

Model.aggregate(pipeline, function(err, result) {
    if (err) { /* handle error */ };
    console.log(JSON.stringify(result));
});