如何解决MongoDB - mapReduce
我有 mongoDB 集合,其中每个文档看起来像:
{
"_id": 1,"name": "Aurelia Menendez","scores": [{
"score": 60.06045071030959,"type": "exam"
},{
"score": 52.79790691903873,"type": "quiz"
},{
"score": 71.76133439165544,"type": "homework"
}]
}
我试着跑:
db.students.mapReduce(
function() {
emit(this._id,this.scores.map(a => a.score));
},function(_id,values) {
//here i try:
1) return values.reduce((a,b) => a + b);
2) return values.reduce((a,b) => a + b,0);
3) return Array.sum(values);
},{ out: "total_scores" }
)
我得到了什么?我得到了每个文档看起来像的集合:
- “值”是数组:
{
"_id": 20,"value": [42.17439799514388,71.99314840599558,81.23972632069464]
}
- “价值”就是价值
{
"_id": 188,"value": "060.314725741828,41.12327471818652,74.8699176311771"
}
- “值”是数组
{
"_id": 193,"value": [47.67196715489599,41.55743490493954,70.4612811769744]
}
为什么我没有得到元素的总和?当我尝试使用 this.scores
或 this.scores.score
而不是 this.scores.map(a => a.score)
时,我拥有所有属性或空值。
也许有人知道,我做错了什么?
解决方法
您应该使用聚合而不是 MapReduce。这是Mongo官方文档的注释
聚合管道提供更好的性能和更一致的 接口比map-reduce,各种map-reduce操作都可以 使用聚合管道运算符重写,例如 $group, $merge、$accumulator 等。
我用来获得聚合阶段的步骤:
- 使用 MongoDB Compass 并打开聚合选项卡来测试聚合。
- 添加阶段:$match:过滤学生,$unwind:压平分数数组,$group:通过对所有分数求和得到总分。
- 转换为代码
结果是
[
{
'$match': {
'name': 'Aurelia Menendez'
}
},{
'$unwind': {
'path': '$scores'
}
},{
'$group': {
'_id': '$_id','total': {
'$sum': '$scores.score'
}
}
}
]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。