基于时间的Couchbase查询

时间:2013-11-08 02:49:36

标签: java couchbase couchbase-view

我一直在试图找出如何根据时间戳恢复数据。基本上我想基于时间戳字段查询100个文档。 100个文档应该比我传递它的时间戳更旧。此外,我想创建一个刷新,我可以传递一个时间戳,我得到100个更新的文档。显然逻辑在这里会有所不同,但很难弄清楚Couchbase如何实现这一目标。

这是我到目前为止所做的:

我的观点,正如您所看到的,我还需要使用复杂的密钥,因为我不仅要检查日期,还要查看我的可见性字段。我在视图的缩小部分没有任何内容。

 function (doc, meta) 
{
  if(meta.type == "json" && doc.type == "POST" && doc.created != null) 
  {
    emit([dateToArray(doc.created), doc.visibility], null);
  }
}

我正在使用java客户端查询,将limit设置为2进行测试。这里有什么奇怪的是setDescending必须是false才能得到任何回报。我传递的日期也无关紧要我总能得到一个结果。我想要的预期行为是传递日期,只获得等于或早于日期的结果。

 View view = client.getView("dev_posts", "post_list");
  ComplexKey keys = ComplexKey.of(DataConstants.getDateAsArray(startDate), postType);

  Query query = new Query();
  query.setRangeStart(keys);
  query.setIncludeDocs(true);
  query.setLimit(2);
  query.setDescending(false);

  ViewResponse response = client.query(view, query);

编辑:

基本上我从Couchbase寻找的东西类似于Facebook,Pintrest等移动应用程序。在用户刷新的给定时间戳上,我想获得更新的东西。当用户滚动时,我想让下一个组超过特定日期。

**更新**

所以这已经解决了,但是要进一步调查。 ComplexKey正在将我们的日期数组转换为“[2013,11,8,20,0,0]”而不是[2013,11,8,20,0,0]。要进一步调查它。现在解决的办法是不使用ComplexKey,而是创建我们自己的复杂密钥,并将其作为一个密钥传递给startKey。

2 个答案:

答案 0 :(得分:1)

您需要重新排序并发出复合键,如下所示:

function (doc, meta) {
  if(meta.type == "json" {
    if(doc.type == "POST") {
      emit([doc.visibility,dateToArray(doc.created)], null);    
    }
  }
}

将产生如下密钥:[true,[2013,11,8,20,0,0]]

以上面这样的格式传入一个startKey和endKey,这将过滤所有文件,因为startKey日期是doc.visibility False或True(取决于你的开始键),我假设你只需要doc.visibility = = true。

您的返回键将按复合键的第一部分排序,因此ViewResult中的第一个结果实际上是返回的最旧文档。因此,如果您想要最新的文档,则必须在应用程序逻辑中反转数组。

如果您正在构建一个' live'请务必考虑陈旧参数。进料。

答案 1 :(得分:0)

您可以使用具有两级层次结构的reference documents系统。在第一级文档中,这些id是时间戳(Ref::)。他们最终应该包含你的ids文件。在二级文档中,包含所有引用的ID。第一级的文件。如果参考文档的数量太大,您可以使用第三级参考。如果有些事情不完全清楚,请告诉我,我会尝试以不同的方式解释它。

P.S。您也可以使用ElasticSearch。这将使您有机会在不创建参考文档层次结构的情况下执行任何请求,但可能存在内存和延迟复制的问题。