2017-08-15 79 views
1

你好朋友我不友好与mongodb聚合我想要的是,我有对象的数组,包含与每个问题的得分主题,我使用节点js,所以我想要的是用mongo查询完整计算如果可能的话,其中包括主题名称与尝试总得分和数量,而不是尝试我的JSON数组是波纹管总计逻辑值

{ 
    "examId": ObjectId("597367af7d8d3219d88c4341"), 
    "questionId": ObjectId("597368207d8d3219d88c4342"), 
    "questionNo": 1, 
    "subject": "Reasoning Ability", 
    "yourChoice": "A", 
    "correctMark": "1", 
    "attempt": true, 
    "notAttempt": false, 
} 

在这里对象中的一个字段是正确标记主题是不同的我要像

输出
|Subject Name | Total attempts | total not attempts | total score | 
| A   | 5    | 3     | 10   | 
| B   | 10    | 5     | 25   | 

我正在尝试加agg但尚未完成我已尝试此查询

db.examscores.aggregate([ 
    { $group:{ 
    _id:"$examId", 
    score: { $sum: '$correctMark' }, 
    count: { $sum: 1 } 
    }} 
]) 

任何人都有想法如何实现这种类型的输出。 如果用另一种方式来实现这个使用节点也比较好。

+0

,您在您目前得到什么输出?你用''correctMark'你可以使用'$ attempt'类似的方法,你需要使用'$ cond'和'$ eq' –

+0

我得到的总记录数为0,correctMark是我的包含用户给出的每个问题的分数的字段名称 – Kalpesh

+0

您基本上正在查找['$ cond'](https://docs.mongodb.com/manual/reference/operator/aggregation/cond/)以返回' 1“或”0“,具体取决于已经存储的逻辑值,或者其他逻辑评估。你需要注意的是,由于你的文档当前站在''correctMark''实际上是持有“字符串”而不是数字值。如果你尝试使用'$ sum'和一个“字符串”,结果将始终为“0”。所以你需要修复你的数据作为一个优先事项。 –

回答

0

我已经解决了这个,这里是我的查询

[ 
{ $match: { subject:'Reasoning Ability' } }, 
{ 
    $group: 
    { 
     _id:{id:"$examId",subject:'$subject'}, 
     totalAttempt: { $sum: {$cond : [ "$attempt", 1, 0 ]} }, 
     totalNotAttempt: { $sum: {$cond : [ "$notAttempt", 1, 0 ]} }, 
     markedForReview:{ $sum: {$cond : [ "$markedForReview", 1, 0 ]} }, 
     answerAndMarkedForReview:{ $sum: {$cond : [ "$answerAndMarkedForReview", 1, 0 ]} }, 
     score: { $sum: '$correctMark' }, 
     count: { $sum: 1 } 
    } 
} 

]