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

Posted

技术标签:

【中文标题】使用视图在 couchDB 中的文档之间返回唯一值【英文标题】:Returning a unique value across documents in couchDB usings views 【发布时间】: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
]

【问题讨论】:

【参考方案1】:

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

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

地图如下:

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 可以以聪明的方式使用:)

以上是关于使用视图在 couchDB 中的文档之间返回唯一值的主要内容,如果未能解决你的问题,请参考以下文章

在 CouchDB 中链接文档

高效批量删除 couchDB 中的文档

CouchDB:在视图中代表 NVL()

CouchDB - 按位置对文档进行排序

如何在CouchDB中实现唯一键约束

删除 CouchDB 中的过期文档