使用视图过滤文档 ID?

Filtering document ID using views?

我正在使用 cloudant 数据库来存储我的值,并且我指定了我的 文档 ID 为字符串+日期(ddmmyy)(例如 foo071117)。最近我 需要过滤文档以显示最近7天的文档 (例如 foo311017 到 foo061117)我已经使用视图来做到这一点。这是我的代码:

function (doc) {
  var datearr = [];
  var today = new Date()
  for (var i =1; i<=7; i++){
    var datesfull = new Date(today.getFullYear(), today.getMonth(), today.getDate() - i);
    var dd = datesfull.getDate();
    if (dd<10){
       dd = '0'+dd;
    }
    var mm = datesfull.getMonth()+1;
    if (mm<10){
       mm ='0'+mm  
    }
    var yy = datesfull.getFullYear().toString().substr(-2);
    var dates = "foo" + dd + mm + yy;
    datearr.push(dates);
  }
  if((datearr.indexOf(doc._id.slice(0,-1))>=0) || (datearr.indexOf(doc._id)>=0)){
  emit(doc._id,doc);
  }
}

切片用于当我的 json 文件变得太大而我必须将文件拆分为多个文件时(例如 foo0711170、foo0711171)

此代码在开始时与 运行 之后一样有效,cloudant 视图仅显示我想要的 7 个文档。然而,随着时间的推移,旧文件仍然存在,而不是只有 7 个文件。 Cloudant 是否应该刷新以在我的代码中指定的视图中显示 7 个文档,或者这是由于数据的存储方式所致?

*我无法使用 URL 查询过去 7 天的数据,因为我使用的是 powerBI,这限制了我编写代码来指定要提取的文档 ID 的能力,因此我只能将视图用作一个过滤器

当您向 Cloudant 提供带有索引定义的设计文档时,将构建视图并将其存储在磁盘上。然后您可以稍后查询该视图以获取其结果。

在您的设计文档中,您得到的时间是 "now",在本例中是执行索引的时间 - 而不是执行查询的时间。因此它不能用于提取数据 "in the last 7 days"(查询时间)。

一种解决方案是更改文档 _id 的构建方式。如果您使用:yyyymmdd+string,那么您的文档将按日期顺序存储,因为 Cloudant 在 _id 字段上有一个主索引。

然后您可以查询数据库的主索引,从过去 7 天的键开始,例如:

/mydb/_all_docs?startkey=20171101&include_docs=true