Couchbase使用密钥获取给定日期范围的文档

时间:2015-09-04 22:42:52

标签: java spring view couchbase

这是我保存在我的存储桶中的示例文档之一

{
  "id": "639882607203778560",
  "text": "How does Andy Reid describe the no WR touchdown stat?",
  "name": "chiefs",
  "createdAt": 1441394876000,
}

我需要获取给定名称和日期范围的文档。所以这是我为它创建的视图,

function (doc, meta) {
  if (doc._class == "com.link.data" && doc.createdAt && doc.name) {
    emit([doc.createdAt,doc.name], null);
  }
}

这将为我提供给定日期范围的所有文档,但不会根据名称进行过滤。我也有其他名字的所有文件。我怎样才能做到这一点?还有什么是java的正确实现?

这是我当前的impl,我想在不使用N1ql的情况下这样做。

query.setRange(ComplexKey.of(1441376400000L, name), ComplexKey.of(1441396800000L,name));

我尝试将范围添加为startKey和endKey。然后将该名称作为couchbase UI中的键,它不起作用。

2 个答案:

答案 0 :(得分:1)

免责声明:我对CB中的复合/复合键没有太多经验。

我相信您要求的内容无法通过单一视图完成:按日期排序,然后按特定名称进行过滤。您可以对范围进行排序,然后按名称分组,但您仍然可以获得存储桶中的所有各种名称(正如您已经注意到的那样)。

可以做的是使用两个单独的视图,然后将结果相交:获取所需名称的doc-id,获取所需范围内的文档并在java中查找交集码。由于视图只是“最终一致”,因此您的结果与单个视图请求一样好,因此您在这里浪费的唯一事情是带宽和一点时间,但不是结果精度。

答案 1 :(得分:0)

“给定”是指完全匹配? 如果要获得具有完全匹配名称和日期范围的结果,请尝试使用:( / p>)发出()

emit([doc.name, doc.createdAt], null);

键数组本身,emit()函数中的第一个arg是排序顺序。