【问题标题】:CouchDB view map function that doesn't segregate reduce keys不分离reduce键的CouchDB视图映射函数
【发布时间】:2012-07-23 08:33:25
【问题描述】:

这是文档“模式”

{
    type: "offer",
    product: "xxx",
    price: "14",
    valid_from: [2012, 7, 1, 0, 0, 0]
} 

有很多这样的文件,在过去和未来有很多有效日期,而且很多时候在同一个月有两个或三个报价。我找不到制作以下视图的方法:给定一个日期,给我一份产品列表及其在该日期的运行报价。

我认为我需要发出valid_date 字段以便将查询的结束键设置为给定日期,然后我需要减少该字段的最大值,这意味着我不能发出它。

我记错了吗?我对 map/reduce 概念完全陌生。有什么建议吗?

【问题讨论】:

  • 为什么不使用时间戳作为日期字段?并且对于范围(开始键和结束键)非常简单
  • 是的,我可以。我没有强烈的意见,我只是觉得它会更容易操纵它。但我认为它并没有改变我的问题。

标签: couchdb mapreduce


【解决方案1】:

您的 cmets 真的很想减少,根据您的要求,您只需要一个映射函数 - 没有减少。这是根据您要求的地图功能:

function(d) {
  if( d.type === 'offer' ) {
    var dd = d.valid_from;

    dd[1] = ( '0' + ( dd[1] + 1 )).slice(-2);   // remove the +1 if 7 is July not August
    dd[2] = ( '0' + dd[2] ).slice(-2);

    emit( dd.slice(0,3).join('-') );
  }
}

然后要显示对给定日期有效的所有优惠,您可以使用以下参数查询此视图:

endkey="2012-08-01"&include_docs=true

【讨论】:

  • 到目前为止一切顺利,但现在我如何才能获得正在运行的报价?正在运行的报价是在给定范围内具有最大 valid_from 的文档。假设为了简单起见,我只将月份编号保留为 valid_from。假设我有 2 个产品和每个产品的 3 个报价,并且我想找到每个产品在特定月份范围内的最新报价。如果我发出([月,产品],报价),地图将按月份排序,这意味着我不能通过返回 max(values.month)来减少。如果我发出([product,month], offer) 那么我不能在月份进行范围查询。
  • 好的,不清楚。只需选择返回的最后一行。如果您有很多记录,请从查询中删除 include_docs=true,这样您就可以从最后一行获取 ID,然后重新查询该文档。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-24
相关资源
最近更新 更多