如何在CouchDB文档中插入自动增量/序号值?

时间:2014-11-01 13:44:20

标签: couchdb

我目前正在使用couchDB,并且有以下情况: 我正在实施问题跟踪器。要求是每个问题文档都有(除了它的文档_id)一个唯一的数字序号,以便以更合适的方式引用它。

我的第一种方法是拥有一个视图,它只返回当前存储的唯一问题文档的数量。将客户端的值增加1,将其分配给我的新问题并插入。 当使用ajax调用插入多个问题或让多个客户端同时添加问题时,结果是一个坏主意。在后一种情况下,如果没有客户之间的沟通,就不可能实现。

理想情况下,我希望在沙发上生成序列号,由于分布式系统中的状态存在冲突,因此无法实现。

是否有任何好的模式可以使用(可能在客户端)来解决这个问题?我觉得这是一种标准的用例(考虑发票号码等)。

提前致谢!

2 个答案:

答案 0 :(得分:1)

您可以使用一个空的单独文档,但它只包含idrevrev前缀始终是整数,因此您可以将其用作自动递增数字。

只需对您的文档进行POST,这将增加rev并将其返回。然后,您可以将此生成的值用于您的目的。

替代方式:

创建一个单独的文档,其中包含valuelock。然后执行如下操作:" IF lock == true然后返回ELSE set lock = true并将值增加1",然后执行GET以检索新value并最终设置{{1} }。

答案 1 :(得分:0)

我同意你的看法,使用一个给你一个文件计数的视图并不是一个好主意。而这正是couchdb使用uuid的原因。

我不知道couchdb中的顺序ID功能,但认为它很容易编写。我考虑过:

  • RPC(例如,使用RabbitMQ)调用单个服务以避免并发问题。然后,您可以将最新的号码存储在特定的非分布式couchdb或其他位置的专用文档中。这可能不会特别好地扩展,但是在问题成为问题之前,您正在编写问题跟踪系统。
  • 如果您可以允许丢失数字,请将沙发上的uuid算法设置为顺序,并且在第一个缓冲区溢出之前至少是好的。请在以下网址查看更多信息:http://couchdb.readthedocs.org/en/latest/config/misc.html#uuids-configuration