javascript - 在集合的键中查找最大数据长度

标签 javascript mongodb mapreduce

{
  "_id" : ObjectId("59786a62a96166007d7e364dsadasfafsdfsdgdfgfd"),
  "someotherdata" : {
    "place1" : "lwekjfrhweriufesdfwergfwr",
    "place2" : "sgfertgryrctshyctrhysdthc ",
    "place3" : "sdfsdgfrdgfvk",
    "place4" : "asdfkjaseeeeeeeeeeeeeeeeefjnhwklegvds."
  }
}

我的收藏中有数千个。我需要查看所有其他数据并执行以下操作

  1. 检查它是否存在(在某些记录中我有 place1 而不是 place4)
  2. 找到最长的记录(根据字符串长度)

输出必须看起来像这样(显示最长的字符数)

{   
  place1: 123,
  place2: 12,
  place3: 17
  place4: 445
}

我正在使用 Mongodb 3.2.9,因此无法访问新的聚合函数。但我确实有 Mongodb shell

编辑:明确地说,我想要整个系列中最长的。因此,可能有 1000 个文档,但整个集合中每个字段只有一个长度最长的结果。

最佳答案

为此使用 .mapReduce() 减少每个键的最大值:

db.collection.mapReduce(
  function() {
    emit(null,
      Object.keys(this.someotherdata).map(k => ({ [k]: this.someotherdata[k].length }))
       .reduce((acc,curr) => Object.assign(acc,curr),{})
    );
  },
  function(key,values) {
    var result = {};
    values.forEach(value => {
      Object.keys(value).forEach(k => {
        if (!result.hasOwnProperty(k))
          result[k] = 0;
        if ( value[k] > result[k] )
          result[k] = value[k];
      });
    });
    return result;
  },
  { 
    "out": { "inline": 1 },
    "query": { "someotherdata": { "$exists": true } }
  }
)

它基本上发出每个文档的子文档路径中存在的每个键的“长度”,然后在“减少”中,只有最大的“长度” 实际上返回了每个 key 。

请注意,在 mapReduce 中,您需要输出与输入的结构相同的结构,因为它处理大量文档的方式是逐步“减少”。这就是我们以数字形式发出的原因,就像“reduce”函数一样。

在问题中显示的文档中提供此输出。当然,当您有更多文档时,它是集合中所有文档的“最大值”。

   {
        "_id" : null,
        "value" : {
            "place1" : 25.0,
            "place2" : 26.0,
            "place3" : 13.0,
            "place4" : 38.0
        }
    }

对于感兴趣的人,问题的背景实际上是他们无法使用 MongoDB 3.4 的功能。但是要在功能可用的地方使用 .aggregate() 做同样的事情:

db.collection.aggregate([
  { "$match": { "someotherdata": { "$exists": true } } },
  { "$project": {
    "_id": 0,
    "someotherdata": {
      "$map": { 
        "input": { "$objectToArray": "$someotherdata" },
        "as": "s",
        "in": { "k": "$$s.k", "v": { "$strLenCP": "$$s.v" } }
      }
    }
  }},
  { "$unwind": "$someotherdata" },
  { "$group": {
     "_id": "$someotherdata.k",
     "v": { "$max": "$someotherdata.v" }    
  }},
  { "$sort": { "_id": 1 } },
  { "$group": {
    "_id": null,
    "data": {
      "$push": { "k": "$_id", "v": "$v" }
    }    
  }},
  { "$replaceRoot": {
    "newRoot": {
      "$arrayToObject": "$data"   
    } 
  }}
])

同样的输出:

{
    "place1" : 25,
    "place2" : 26,
    "place3" : 13,
    "place4" : 38
}

关于javascript - 在集合的键中查找最大数据长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45441813/

相关文章:

javascript - 在 Javascript 中覆盖警报和确认

mongodb - 使用 Mongo DB 的 PyTorch DataLoader

hadoop - 当mapred.job.shuffle.input.buffer.percent=0.70时pig join在reducer中出现OutOfMemoryError

hadoop - 怎么知道没有。在 map 作业中运行的节点数

javascript - 将所有功能移动到子窗口

JavaScript promise 句柄 404

node.js - 将 Backbone.iobind (socket.io) 与 Node.js 服务器集群结合使用

node.js - 测验网站的 Mongo 架构

hadoop - 无法找到或加载主类256-纱簇

javascript - 无法调用AJAX