Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在集合的键中查找数据的最大长度_Javascript_Mongodb_Mapreduce - Fatal编程技术网

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

Javascript 在集合的键中查找数据的最大长度,javascript,mongodb,mapreduce,Javascript,Mongodb,Mapreduce,我的收藏中有数千件。我需要查看所有SomeOther数据并执行以下操作 检查它是否存在(在一些记录中,我有位置1,没有位置4) 查找最长的记录(以字符串长度为单位) 输出必须如下所示(显示最长字符数) 我正在使用Mongodb 3.2.9,因此无法访问新的聚合函数。但我有Mongodb的外壳 编辑:为了清楚起见,我想要整个系列中最长的。因此,可能有1000个文档,但在整个集合中,每个字段只有一个最长的结果 为此,请使用.mapReduce()将每个键的值减小到最大值: { place1

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

  • 检查它是否存在(在一些记录中,我有位置1,没有位置4)
  • 查找最长的记录(以字符串长度为单位)
  • 输出必须如下所示(显示最长字符数)

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

    编辑:为了清楚起见,我想要整个系列中最长的。因此,可能有1000个文档,但在整个集合中,每个字段只有一个最长的结果

    为此,请使用
    .mapReduce()
    将每个键的值减小到最大值:

    {   
      place1: 123,
      place2: 12,
      place3: 17
      place4: 445
    }
    
    它基本上发出每个文档的子文档路径中存在的每个键的
    “长度”
    ,然后在“缩减”中,实际上只返回每个键的最大
    “长度”

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

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

    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 } }
      }
    )
    

    对于感兴趣的人来说,问题的背景实际上是MongoDB 3.4的功能对他们来说是不可用的。但要在功能可用的情况下使用
    .aggregate()
    执行相同的操作:

       {
            "_id" : null,
            "value" : {
                "place1" : 25.0,
                "place2" : 26.0,
                "place3" : 13.0,
                "place4" : 38.0
            }
        }
    
    具有相同的输出:

    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"   
        } 
      }}
    ])
    
    用于遍历集合。
    跟踪最长的placen值(从-1开始,找到较大值时更新)。使用
    Print()
    printjson()

    打印值,而无需访问
    $strLenBytes
    $strLenCP
    您需要使用
    mapReduce
    并使用JavaScript函数返回每个属性的长度。现在还不清楚您是在要求整个集合中的“每个键的最长长度”,还是“每个文档中每个键的长度”,甚至还不清楚输出应该是什么。例如,您显示的文档有4个可能的键,仅输出3个。@NeilLunn我已经编辑了我的答案当我在ROBO 3T mongo shell中运行时,它显示“错误:第6行:意外标记;@32423hjh32423我的错误”。缺少括号。表示无法执行脚本。错误:映射减少失败:{“确定”:0,“errmsg”:“类型错误:this.someotherdata[k]为空:\n_funcs1/@32423hjh32423 Well是实际调用的
    ”someotherdata的字段"
    ?因为这是在你的问题中。如果你的数据与你在问题中的数据不同,那么这些更改取决于你,而不是回答问题的人。我可以添加一个
    $exists
    ,以丢弃没有字段的文档,但这取决于你是否使用正确的命名。我理解你提到的命名问题,我有一个问题ged的名字,但我已经补偿了。这只是一个直接交换的东西。我认为$exists将是有用的,因为我认为这就是为什么它是失败的,因为在集合中的项目之间的差异。谢谢
    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
    }