【问题标题】:MongoDB - mapReduceMongoDB - mapReduce
【发布时间】:2021-04-07 08:13:22
【问题描述】:

我有 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" }
 )

我得到了什么?我得到每个文档的集合:

  1. “值”是数组:
{
    "_id": 20,
    "value": [42.17439799514388, 71.99314840599558, 81.23972632069464]
}
  1. “价值”就是价值
{
    "_id": 188,
    "value": "060.314725741828,41.12327471818652,74.8699176311771"
}
  1. “值”是数组
{
    "_id": 193,
    "value": [47.67196715489599, 41.55743490493954, 70.4612811769744]
}

为什么我没有得到元素的总和?当我尝试使用this.scoresthis.scores.score 而不是this.scores.map(a => a.score) 时,我拥有所有属性或空值。

也许有人知道,我做错了什么?

【问题讨论】:

    标签: javascript mongodb mapreduce


    【解决方案1】:

    您应该使用聚合而不是 MapReduce。这是 Mongo 官方文档中的注释

    聚合管道提供更好的性能和更一致的 接口比map-reduce,各种map-reduce操作都可以 使用聚合管道运算符重写,例如 $group, $merge、$accumulator 等。

    我用来获取聚合阶段的步骤:

    1. 使用 MongoDB Compass 并打开聚合选项卡来测试聚合。
    2. 添加阶段:$match:过滤学生,$unwind:压平分数数组,$group:通过对所有分数求和得到总分。
    3. 转换为代码

    结果是

    [
      {
        '$match': {
          'name': 'Aurelia Menendez'
        }
      }, {
        '$unwind': {
          'path': '$scores'
        }
      }, {
        '$group': {
          '_id': '$_id', 
          'total': {
            '$sum': '$scores.score'
          }
        }
      }
    ]
    
    

    【讨论】:

    • 另请注意,聚合不需要您启用“服务器端 javascript”。启用该功能会带来安全风险。
    猜你喜欢
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 2014-08-01
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多