使用视图在couchDB中的各个文档之间返回唯一值

Returning a unique value across documents in couchDB usings views

本文关键字:文档 之间 返回 唯一 视图 couchDB      更新时间:2023-09-26

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

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

{
   "_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}
]}

我实际上找到了一个更简单的方法。基本步骤如下:

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

和减少看起来像:

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

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

这个用例是当每个文档都有一个被修改的文件列表和修改发生的日期,但是您想知道每个文档的最新修改日期。