如何在Marklogic中使用xdmp:eval进行Point In Time查询?

时间:2018-02-09 10:56:34

标签: marklogic marklogic-9

我更改了数据库的合并策略。我将合并时间戳设置为当前timesatmp(15181726371585905)。更改合并策略后,我更新了一个具有相同URI和集合的文档。现在当我试图获取已删除的文档时,我没有得到它。我的序列空白了。

xdmp:eval("doc('/docs/test.xml')", (),
<options xmlns="xdmp:eval">
  <timestamp>{xdmp:request-timestamp()-1}</timestamp>
</options>)

如何使用上述查询获取已删除的文档。

TIA。

2 个答案:

答案 0 :(得分:2)

尝试了这个并获得最新版本,而不是空序列。以下是我对您尝试做的事情的理解:

您已将时间戳设置为当前时间( t ),然后插入文档(时间 t + m ),然后插入新版本相同URI的文档(在 t + n 时)。您现在想要从时间 t + m 检索文档。

问题在于您为读取请求指定时间戳的方式:

<timestamp>{xdmp:request-timestamp()-1}</timestamp>

您要求MarkLogic将时钟倒回一个时钟,并为您提供当时存在的文档。但是,时间戳确实与时钟时间相关;当数据库状态发生变化时,它们不会增加。来自MarkLogic的Administrator's Guide

  

刻度线以每秒10,000,000个刻度计算

因此,通过从当前时间戳中减去一个,您要求返回大约1 / 10,000,000秒。

如果您知道要查询数据库的挂钟时间,可以使用xdmp:wallclock-to-timestamp找到相应的时间戳。

另外,您还在Stack Overflow上询问了如何跟踪文档的多个版本的问题。我想提醒您不要将时间点查询视为其中之一,如果这是您的想法。为此,文档库服务或双时态文档是更好的解决方案。有关为何不使用PIT查询进行版本控制的更多信息,我将引用您的管理员指南的Overview of Merges部分,特别是&#34;禁用合并的危险&#34;和&#34;合并将改变分数&#34;部分。

答案 1 :(得分:0)

将merge-timestamp设置为当前时间会告诉服务器保持该点的片段。在设置新的merge-timestamp值之前,系统中的所有文档在逻辑上都具有该时间之前的片段时间戳。因此,当您更新文档时,系统不再提供以前的版本(因为您说从现在开始只保留带有片段时间戳的文档)。

一些参考文献: