如何在couchdb文档中生成部分唯一且顺序的字段?

问题描述:

我很新的CouchDB的,我想知道我怎么可以创建ID的那个样子。如何在couchdb文档中生成部分唯一且顺序的字段?

Employee:DBX-**0001**-SP

数部必须是唯一的和顺序的。我如何在couchdb中实现这样的功能?我搜索了所有,我找不到任何简单的解决方案。

这将是最好的,如果我可以生成在CouchDB中在客户机侧的连续部分,而不是避免复制过程中的碰撞。

我现在的解决方案是我检索存储的文档,看起来像这样{“_id”:“EmployeeAutoIncrement”,value:1}检索时,我递增值并将其发送回服务器if这些都是成功的话,我返回新增加值,并把它作为我的自动递增值是ID员工的一部分:DBX- AUTO_INCREMENT_VALUE_HERE -SP

这样做的问题是,如果两个人做出的请求EmployeeAutoIncrement在同一时间,他们都更新它会不会导致冲突?另外,如果一个人提出请求而他们离线,他们又回到网上,那么这不会导致冲突吗?

+0

如果我是你,我会尝试通过'JSON.stringify(new Date())'作为自动增量使用UTC日期。这是独特的,连续的,作为奖励存储创建的日期。我不确定在服务器端如何做到这一点,所以可能会有多个客户端试图在同一毫秒内创建文档的问题。如果由于已经存在_id而导致失败,那么您可以重试一次,这应该解释大多数情况。 –

+0

对不起,但我不明白如何从中得到序列号。它应该是像0001 0002 0003 0004 0005这样的顺序。请详细说明JSON.stringify(new Date())会给我带来怎样的结果0001 0002 ... –

+0

它不会给你一个没有间隙的序列,但它很容易被排序按照升序排列,如果这就是你所需要的 –

它可以(在某种程度上)来完成,但我建议你考虑一下你的设计选择,你为什么要这样做了分布式数据库 - 它可能是客户端,你可以控制序列化到你的序列上做得更好发电机。

如果你想这样做,至少部分地在服务器上,您将需要一个所谓的CRDT计数器的实现,如下面的文件中提出:

http://hal.upmc.fr/docs/00/55/55/88/PDF/techreport.pdf

你可以找到一个Ruby实现的一些这些想法在这里:

https://github.com/aphyr/meangirls

和一个简单的具体沙发的实现计数器(一个你需要的)和一个设置在这里:

https://github.com/drsm79/couch-crdt

后者,而用Python写的,会做一切你想要什么,如果你遵循下面的示例所示的模式:

https://github.com/drsm79/couch-crdt/blob/master/examples/counter.py

,这将给你你的单调序列。从那里,创建你的文档_id。

翻译成JavaScript和PouchDB作为练习留给读者。使用多个客户,其中一些可能是离线时

+0

虽然我还没有很好的解决方案,但您确实提供了很多有用的链接,这些链接为我提供了一些想法。因此我选择给你赏金的原因。非常感谢! (y)的 –

所有的要求不能得到满足的客户端。

这是一个过程,导致在单调增加ID:

  1. 每个客户节省了一个独特的ID的记录。记录应该包括一个标记为临时记录的标志。
  2. 建立一个external process,它会监听changes feed中标记为临时的记录。按“应用程序的时间顺序”更改feed输出记录。
  3. 外部过程应使用正确的标识创建新记录,并将其标记为永久标记。由于只有该进程会创建“永久”记录,因此它可以读写EmployeeAutoIncrement值而不会产生冲突。
  4. 外部进程可以删除临时记录。

数据库的记录数会增加一倍,所以它的增长速度会更快,如果空间有问题,就需要尽快压缩。如果在外部进程添加新记录时运行查询,则员工记录上的任何查看/查询都需要检查永久标志。