node.js - 如何使用 mongoose 聚合函数计算每个评分

标签 node.js mongodb mongoose

如何使用 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
        }
    ]

},{...}]

如何解决这个问题?

最佳答案

使用以下聚合管道:

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));
});

关于node.js - 如何使用 mongoose 聚合函数计算每个评分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34627781/

相关文章:

node.js - phpStorm 重新加载正在运行的 Node.js 服务器

javascript - 在导出的 Mongoose 模型中使用 Mongoose 模式函数

node.js - 如何比较 MongoDB(NodeJS + Mongoose )中的日期?

node.js - Mongoose:每天创建多少用户

Node.js HTML5 样板服务器配置集成

node.js - 如何将对话引用(字典)存储到Azure DB存储中

javascript - 使用 express-fileupload 在 NodeJs 中上传文件无法正常工作

mongodb - 日志查看实用程序数据库选择

mongodb - 将 MongoDB 查询转换为 MongoDB java 驱动程序查询

javascript - Mongoose 文本搜索未返回任何结果