首页 文章

在Couchbase中,包含过期文档以查询具有NULL内容的视图列表

提问于
浏览
0

最近我们开始使用couchbase,我们使用java spring-data-couchbase和Jersey来访问couchbase . 访问低级java-sdk-api,我们使用KEY(id)将到期时间(TTL)设置为特定文档 . 它工作正常 . 代码如下 .

// define couchbaseTemplate for lower-level access to Java SDK
@Autowired
CouchbaseTemplate couchbaseTemplate;


// setExpiry method update expiry given a doc ID
@Override
public void setExpiry(String key, int expN) throws RepositoryException {
    couchbaseTemplate.getCouchbaseClient().touch(key, expN);
}

我们面临的问题是当我们尝试使用查询获取文档列表时,列表包含过期的文档 . 当我们尝试从列表中访问文档时,我们发现它是null .

但是如果我们在一段时间后执行查询,则过期的文档不再包含在列表中 .

示例:当expN = 10秒时,我们在设置TTL后大约10秒执行查询,包含过期文档如果我们在设置TTL后大约20秒执行查询,则不再包含过期文档

在我们设定的陈旧选项中

Query.setStale(Stale.false)

我们试图操纵

Query.setIncludeDocs

但没有运气,任何帮助....

2 回答

  • 2

    Couchbase Server懒洋洋地做了expiries . 项目可以通过三种方式过期:

    • 访问文档(获取操作)时,将检查到期值

    • 当到期寻呼机运行时

    • 磁盘compaction process运行时(仅限Couchbase Server 3及更高版本)

    由于这些视图在这三个进程中的一个发生之前不会更新 .

    对于此用例,您可以使用当前时间对视图进行范围查询,因此它只返回尚未过期的文档 . 假设集群上的时间与客户端相同,并且正在使用的视图是这个:

    function (doc, meta) {
      emit(meta.expiration, null);
    }
    

    meta.expiration是一个纪元时间戳,因此可以使用以下查询:

    String currentEpoch = String.valueOf((System.currentTimeMillis()/1000)); 
    bucket.query(ViewQuery.from("designdoc", "myview").startkey(currentEpoch));
    

    请注意,这将返回所有已设置到期日的活动文档 .

    如果您想使用日期格式做一些更有趣的事情,请在Couchbase Server manual的View and query examples章节中查看日期和时间选择的一半 .

  • 0

    正如Couchbase official documents所说,

    在结果集中检测过期文档:如果使用视图来索引Couchbase Server中的项目,则作为到期分页器维护过程的一部分尚未删除的项目将是查询视图返回的结果集的一部分 . 要从结果集中排除这些项,您应该使用查询参数include_doc设置为true . 对于过期文档,如果设置include_doc = true,Couchbase Server将返回一个结果集,指示文档不再存在 . 具体来说,已经过期但尚未被清理过程删除的密钥将在结果集中显示为“doc”:null的行:

    因此,这就是Couchbase如何处理过期文档 .

    对于您的情况,只需过滤掉doc为null的项目,其余的将是您的预期结果 .

相关问题