【问题标题】:MarkLogic: Move document from one directory to another on some conditionMarkLogic:在某些情况下将文档从一个目录移动到另一个目录
【发布时间】:2014-05-05 22:26:39
【问题描述】:

我是 MarkLogic 的新手,并尝试使用其 Java API 实现以下场景:

  1. 对于每个用户,我将有两个目录,例如:

    1.1。 user1/xmls/recent/

    1.2。 user1/xmls/归档/

  2. 当用户使用他的 xml 做某事时 - 它被放到“最近”目录中;
  3. 当用户正在处理他的下一个 xml 并且“最近”目录已满时(例如,有一定数量的文档,比如说 20 个)- 最旧的文档被移动到“归档”目录;
  4. 用户可以从“最近”目录中请求所有文档,并且应该获得不超过 20 条记录;
  5. 用户可以手动从“最近”目录中删除某些内容;在这种情况下,如果它有 20 个文档,删除一个后它必须有 19 个;
  6. 用户可以同时使用他的 xmls 做一些事情,“最近”目录不应超过 20 个条目。

问题是:

  1. 为了正确处理同时将xmls添加到“最近”目录,添加新条目时是否应该阻止整个“最近”目录(实际添加,添加后检查是否有超过20条记录,选择最旧的第 21 个并将其移动到“存档”目录并自动执行所有这些步骤)?我该怎么做?
  2. 关于如何通过 Java API 实现此功能的任何建议?
  3. 是否可以更改文档的 URI(例如,在我的情况下,将“recent”替换为“archived”)?
  4. 我应该考虑在这里使用 MarkLogic 的集合吗?

我对任何建议和 cmets 持开放态度(正如我所说,我是 MarkLogic 的新手,也许我对如何处理所描述场景的想法完全错误)。

【问题讨论】:

    标签: java marklogic nosql


    【解决方案1】:
    1. 您可以使用多语句事务 (MST) 实现事务序列的原子性
    2. 可以从 Java API 进行 MST:http://docs.marklogic.com/guide/java/transactions#id_79848
    3. 无法更改 URI。但是,可以使用 MST 删除旧文档并在原子步骤中使用新 URI 重新插入新文档。这将产生相同的效果。
    4. 可能,根据您的用例判断,除非您必须将最近/存档的信息作为 URI 的一部分,否则将此信息存储在集合中可能更简单。但是,您应该阅读文档并自行评估:http://docs.marklogic.com/guide/search-dev/collections#chapter

    【讨论】:

    • 感谢您的回答。在这里提问之前,我已经阅读了大量的文档。关于这里的事务:docs.marklogic.com/guide/java/transactions#chapter 和这里:docs.marklogic.com/guide/app-dev/transactions#,也许我错过了一些东西,但据我了解 - 在 MST 内,将在文档上锁定(使用“更新”trnsaction),而不是在目录上。我也读过关于锁的文章:docs.marklogic.com/guide/app-dev/locks#chapter,但它提出的问题多于答案(我可以通过 JavaAPI 等来完成)。我还从您的链接中阅读了有关收藏的信息 a
    • 将在此继续:所以我还阅读了有关集合的信息(您发布的链接并在谷歌上搜索),目前尚不清楚我是否应该将它用于我的案例以及它是否会带来一些好处。他们说集合信息存储在文档中,经常更改时可能会很慢。这就是为什么我实际上问的原因:我会从我的案子中得到一些好处吗?
    • 1) 在更新或 MST 事务期间,文档将被锁定。但是,也可以手动锁定整个目录。但是,请注意自动创建目录,这可能会导致您可能没有预料到的锁定行为(并且默认情况下已打开)。 2)我认为您关于收藏的问题没有简单的答案;但是,如果您将两个更新(删除 + 插入)换成一个(集合),这似乎是一个不错的选择。
    • 在哪里可以阅读有关此文档/目录锁定的更多信息?也许关于通过 java API 手动锁定整个目录?
    • @Anatoliy 应用开发指南中有一个关于锁的章节:docs.marklogic.com/guide/app-dev/locks。但是,Java API 是更高级别的 API,我认为没有办法开箱即用地管理锁。您可能需要考虑使用资源扩展机制来做到这一点,这将需要一些 XQuery:docs.marklogic.com/guide/java/resourceservices
    【解决方案2】:

    就我个人而言,我会跳过使用单独目录和集合的所有麻烦。您将不得不无休止地移动文件或更改它们的属性。不预先计算任何东西会容易得多,而只需使用 lastModified 属性或类似的东西来确定运行时最近的项目。

    HTH!

    【讨论】:

    • 我认为最终我将为每个用户提供大量文档。每次我需要得到它们时计算最新的 20 会不会太慢?正因为如此,我才查看专用目录。但也许你是对的,这只是一个初步的优化......
    • 实际上我错过了一个要求,即如果用户删除了对他可见的 20 个最近文档中的一个 - 他应该看到 19 个。如果我将所有文档放在一个目录中并且只选择最新的 20 个 - 这种情况将被破坏(用户可以拥有 21 个最近的文档(只有 20 个显示给他),然后他删除了一个,仍然看到 20 个)。
    • MarkLogic 的搜索速度非常快。它默认支持dateTime范围索引,即使对于数百万个文档,也可以在亚秒内返回按日期排序的前20个。
    • 您对删除文档的描述往往是应用程序在没有数据库支持的情况下倾向于实现这一点的方式。只显示前 20 个最后修改的文档,或者选择性地显示自 7 天前以来发生的任何更改对我来说非常有意义..
    猜你喜欢
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多