【问题标题】:CouchDB filter timestamps in a reduce function - some sort of Date.now?CouchDB 在 reduce 函数中过滤时间戳 - 某种 Date.now?
【发布时间】:2015-04-24 18:20:13
【问题描述】:

可以在 map 或 reduce 函数中使用 Date.now 类型的函数吗?它可以在任何地方使用吗? 更具体地说,视图不得缓存 Date.now 值。 这是我测试过的,仅在更改任何视图功能后的第一次运行时才有效:

function (doc){
  var n = new Date();
  if(doc.TimeStamp > n.getTime() - 30000){
    emit(doc._id, doc);
  }
}

【问题讨论】:

  • 我认为这个问题的答案实际上是“Date()”是一次性的。所以在视图的映射函数中,它在视图索引期间调用映射时调用。我认为 recude() 函数也是如此,所以答案可能是否定的,除非我们同意它是一次性的,否则不能使用 Date()。我最初的意图是获取超过 30 秒的文档(例如)。我使用了 startKey 机制来做到这一点,通过 emit(doc.TimeStamp, doc.usefulField);现在时间戳是关键,可以顺序查询。

标签: mapreduce couchdb


【解决方案1】:

仅当特定文档更新时才会刷新视图行。但是您可以请求该结果的视图:发出 doc.TimeStamp 作为键并使用 ?startkey=timestamp 请求视图,其中时间戳是 now.getTime() - 30000 的值。

【讨论】:

    【解决方案2】:

    是的。 var now = new Date() 应该可以工作。

    条件必须导致false。您可以使用视图对其进行测试:

    function (doc) {
      var now = new Date()
      var timestamp = now.getTime()
    
      emit(timestamp,null)
    }
    

    它会响应类似

    {
      "total_rows":1,
      "offset":0,
      "rows" :[{
       "id":"ecd99521eeda9a79320dd8a6954ecc2c",
       "key":1429904419591, // timestamp as key
       "value":null
      }]
    }
    

    确保doc.TimeStamp 是一个数字(也许你必须执行parseInt(doc.TimeStamp))并且大于timestamp - 30000

    关于你的代码行的两句话emit(doc._id, doc);

    1. 发出doc._id 作为键意味着您可能不需要视图。只需通过GET /databasename/:id 请求文档。此外,在多部分键或视图行的值中包含doc._id 也不是必需的,因为它作为附加属性自动包含在每一行中。一个有效的原因是当您想要根据文档 ID 对视图进行排序时。
    2. 出于视图性能原因,不建议将doc 作为值发出。只需在请求视图时添加?include_docs=true,每一行都会有一个附加属性doc,其中包含整个文档。

    【讨论】:

    • 你能举个例子吗?我将添加我不起作用的代码。它正在缓存视图编译时的值。
    • 感谢您提供更多详细信息。你运行过这段代码吗?我刚刚尝试过,我得到了与我相同的结果,无论我刷新多少次,时间戳值都是相同的。是否有需要设置的配置?我还尝试了两种不同的浏览器,所以这不是浏览器缓存问题。关于 emit(doc._id, doc);这只是显示我的问题的一种快速方法。我抽出了几个字段,这样输入起来更简单。
    • 啊。现在我明白了你的期望:你想接收时间戳不早于now.getTime() - 30000的所有行。
    • 是的,可以这样做吗?我已经在 reduce 函数中测试了 now.getTime() 的工作原理(根据它的工作原理有点意义)。试图找出正确的函数来消除时间戳太旧的键
    • 只有在特定文档更新时才会刷新视图行。但是您可以请求该结果的视图:发出doc.TimeStamp 作为键并使用?startkey=timestamp 请求视图,其中timestampnow.getTime() - 30000 的值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 2012-07-01
    相关资源
    最近更新 更多