【问题标题】:Returning a unique value across documents in couchDB usings views使用视图在 couchDB 中的文档之间返回唯一值
【发布时间】:2014-07-11 19:46:21
【问题描述】:

我有一系列文档,每个文档都包含一个日期和一个字母列表。我需要输出是每个键的单个唯一字母,每个字母的最新日期作为值。

使用如下所示的简单映射函数:

{
   "_id": "_design/output",
   "_rev": "1-c7b904b0e93709113c49127efb40187a",
   "language": "javascript",
   "views": {
       "output": {
           "map": "function(doc) {\n  emit(doc.args.report.updated_partitions, doc.timestamp);\n}",
           "reduce": "function(key, value, reduce) {\n  return (value)\n}"
       }
   }
}

我得到以下结果:

{"total_rows":2,"offset":0,"rows":[
{"id":"8e561dd15fd33acfc7c4502c58008c2a","key":["a","b"],"value":1403818824},
{"id":"8e561dd15fd33acfc7c4502c5800a212","key":["a","c","d"],"value":1403818700}
]}

我正在寻找的输出应该是这样的:

{"total_rows":2,"offset":0,"rows":[
{"id":"8e561dd15fd33acfc7c4502c58008c2a","key":["a"],"value":1403818824},
{"id":"8e561dd15fd33acfc7c4502c58008c2a","key":["b"],"value":1403818824},
{"id":"8e561dd15fd33acfc7c4502c58008c2a","key":["c"],"value":1403818824},
{"id":"8e561dd15fd33acfc7c4502c5800a212","key":["d"],"value":1403818700}
]}

【问题讨论】:

    标签: javascript database view mapreduce couchdb


    【解决方案1】:

    其实我找到了一个更简单的方法。基本步骤是:

    1. 将每个单独的字母映射到日期
    2. 通过按键从所有日期的数组中返回最大值来减少结果。

    地图如下:

    function(doc) {
      var files = doc.args.report.updated_partitions;
      var timestamp = doc.timestamp;
    
      for (i=0; i<files.length; i+= 1){
        var file_name = files[i];
        emit(file_name, timestamp);
      }
    }
    

    reduce 看起来像:

    function(key, value, reduce) {
      return (Math.max.apply(null, value))
    }
    

    结果将是每个字母的唯一键,其中所有文档的最新日期作为值。

    这种情况的用例是每个沙发文档都有一个已修改文件列表和修改日期,但您想知道每个文档的最新修改日期。

    【讨论】:

    • 出色的解决方案学到了一些新东西。感谢您发布此信息。我想如果你考虑一下,reduce 可以以聪明的方式使用:)
    猜你喜欢
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 2014-08-30
    相关资源
    最近更新 更多