在mongodb中使用聚合

时间:2014-01-06 09:52:40

标签: mongodb aggregation-framework

我在mongodatabase中有以下记录。

> db.student.find()
{ "_id" : ObjectId("52ca76140e468ba197e50c23"), "name" : "pratik", "subject" : "maths", "marks" : 68 }
{ "_id" : ObjectId("52ca762b0e468ba197e50c24"), "name" : "pratik", "subject" : "biology", "marks" : 96 }
{ "_id" : ObjectId("52ca77a90e468ba197e50c25"), "name" : "pratik", "subject" : "maths", "marks" : 40 }

从这条记录中我想知道仅为数学科目获得的总分数。 这是我尝试过的,但我不知道在下面的查询中出了什么问题。

db.student.aggregate(
{$match: { 'subject': "maths"}},
{ $group : { _id :{ name:"$name",subject:"$subject",marks:"$marks" },
            total: { $sum : "$marks"}}
})

{
        "result" : [
                {
                        "_id" : {
                                "name" : "pratik",
                                "subject" : "maths",
                                "marks" : 40
                        },
                        "total" : 40
                },
                {
                        "_id" : {
                                "name" : "pratik",
                                "subject" : "maths",
                                "marks" : 68
                        },
                        "total" : 68
                }
        ],
        "ok" : 1
}

请您告诉我上述查询中出现的问题以及正确的答案。 还建议我使用聚合模块的适当指南,以便我可以有效地使用它。我是mongo数据库聚合模块的初学者。

先谢谢。

1 个答案:

答案 0 :(得分:1)

问题是marks内组中的_id字段。它会对标记分数进行分组,然后对你没用,而不是你想要的:

db.student.aggregate(
    {$match: { 'subject': "maths"}}, 
    {$group : { 
        _id :{ name:"$name", subject:"$subject" }, 
        total: { $sum : "$marks"} 
    }}
);