减少函数中的CouchDB过滤器时间戳 - 某种Date.now?

时间:2015-04-24 18:20:14

标签: mapreduce couchdb

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

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

2 个答案:

答案 0 :(得分: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,其中包含完整的文档。

答案 1 :(得分:2)

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