【问题标题】:update_sequence changed semantics in cloudant db?update_sequence 更改了 cloudant db 中的语义?
【发布时间】:2013-12-09 17:57:41
【问题描述】:

我使用 cloudant couchdb,我注意到数据库上的“_changes”查询返回一个不是数字的“update_sequence”,例如

"437985-g1AAAADveJzLYWBgYM..........".

更重要的是,响应不稳定:如果查询数据库 3 次,我会得到 3 个不同的 update_sequences。

“update_sequence”、“since”等已知语义是否有任何变化?

问候, 万吉利斯

【问题讨论】:

    标签: couchdb cloudant


    【解决方案1】:

    转述罗伯特之前给出的答案:

    更新序列值是不透明的。在 CouchDB 中,它们目前是整数,但在 Cloudant 中,值是数据库每个分片的序列值的编码。随着集群支持的增加(通过 BigCouch 合并),CouchDB 将来可能会采用这种方式。

    在 CouchDB 和 Cloudant 中,_changes 将返回一个“seq”值,如果您将其作为“since”传回,则保证返回更新的更新的每一行。 在故障转移的情况下,这可能包括您已经看到的更改。

    因此,读取特定更新序列以来的更改的正确方法是这样的;

    1. 调用 /dbname/_changes?since=
    2. 阅读整个回复,随时应用更改
    3. 将 last_seq 值记录为新的检查点 seq 值。

    不要解释这两个值,你不能比较它们是否相等。如果需要,您可以在步骤 2 中记录任何“seq”值作为当前检查点 seq 值。你不能做的关键事情是比较它们。

    【讨论】:

    • 所以你的意思是保证最近的文档将是results数组中的最后一个文档,并且它的seq值应该用于后续的since -范围?让我困惑的是the docs 这么说: > ...warning:: > _changes 返回的结果是部分排序的。
    • 不能保证最近的文档将是results 数组中的最后一个文档。 CouchDB/Cloudant 将保证返回的文档集至少包括所有在提供的序列值之后更改的文档(并且它也可能返回在此之前更改的文档),但不保证返回的文档的顺序。
    • 我明白了。那么你会为下一个last_seq 选择哪个seq?你说“记录任何 seq 值”,但如果你想要最新的——而不仅仅是任何一个怎么办?这不是很常见的情况吗?我在这里错过了什么?
    • 使用结果中的last_seq 值或您在代码中处理的最后一个seq 值。
    • 啊,我怎么可能错过了 json 响应根目录中的 last_seq。谢谢大家的帮助!
    【解决方案2】:

    它会跳来跳去,表示是一个打包的 base64 字符串,表示数据库每个分片的各种副本的 update_seq。它不能是一个简单的整数,因为它是分布式数据库的快照。

    对于 CouchDB,将 update_seq 视为不透明的 JSON,就可以了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多