2013-12-07 32 views
3

我使用了一个cloudant couchdb,并且我注意到看到数据库上的“_changes”查询返回一个不是数字的“update_sequence”,例如update_sequence改变了cloudant db的语义?

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

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

“update_sequence”,“since”等已知语义是否有任何变化或者什么?

问候, 范吉利斯

回答

1

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

至于CouchDB,将update_seq视为不透明的JSON,你会没事的。

2

复述罗伯特先前给出一个答案:

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

在CouchDB和Cloudant中,如果您将其传回为“since”,_changes将返回一个“seq”值,并确保每一行都返回较新的更新。 在发生故障转移的情况下,可能会包含您已经看到的更改。

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

  1. 呼叫/ DBNAME/_changes?因为=
  2. 读取整个响应,应用更改,当您去
  3. 录制last_seq值作为新的关卡SEQ值。

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

+0

那么你是说可以保证最近的文档将成为'results'数组中的最后一个文档,并且它的'seq'值应该用于后续'since'参数?令我困惑的是[文档](http://docs.couchdb.org/en/2.0.0/api/database/changes.html)这样说: > ...警告:: >结果由_changes返回的部分命令。 – kristianlm

+0

无法保证最近的文档将成为'results'数组中的最后一个文档。 CouchDB/Cloudant将保证返回的文档集至少包含所提供序列值后更改的所有文档(并且可能会返回之前更改的文档),但不保证返回的文档的顺序。 –

+0

我明白了。那么你选择下一个'last_seq'选择哪个'seq'?你说“记录任何seq值”,但是如果你想要最新的 - 不只是任何一个?这不是很常见的情况吗?我在这里错过了什么? – kristianlm