我一直在试图找出如何根据时间戳恢复数据。基本上我想基于时间戳字段查询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。
答案 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。这将使您有机会在不创建参考文档层次结构的情况下执行任何请求,但可能存在内存和延迟复制的问题。