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

如何在CouchDB文档中插入自动递增/序列号值?,couchdb,Couchdb,我目前正在玩couchDB,有以下场景: 我正在实施一个问题跟踪程序。要求是每个问题文件(除了文件id外)都有一个唯一的数字序列号,以便以更合适的方式引用 我的第一种方法是使用一个视图,它只返回当前存储的唯一问题文档的计数。在客户端将该值增加1,将其分配给我的新版本并插入该值。 当使用ajax调用插入多个问题或让多个客户端同时添加问题时,结果证明这是一个坏主意。在后一种情况下,如果没有客户之间的沟通,这甚至是不可能的 理想情况下,我希望在coach上生成序列号,因为分布式系统中的状态冲突,这是不

我目前正在玩couchDB,有以下场景: 我正在实施一个问题跟踪程序。要求是每个问题文件(除了文件id外)都有一个唯一的数字序列号,以便以更合适的方式引用

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

理想情况下,我希望在coach上生成序列号,因为分布式系统中的状态冲突,这是不可能的

有没有什么好的模式可以用来解决这个问题(也许是在客户端)?我觉得这是一种标准的用例(考虑发票号等)


提前谢谢

我同意您的观点,即使用能够提供文档计数的视图不是一个好主意。这也是couchdb使用uuid的原因

我不知道couchdb中有顺序id功能,但我认为它很容易编写。我也会考虑:

  • 对单个服务的RPC(例如使用RabbitMQ)调用,以避免并发问题。然后,您可以将最新的号码存储在特定的非分布式couchdb或其他地方的专用文档中。这可能无法很好地扩展,但在这成为问题之前,您正在编写一个问题跟踪系统
  • 如果您可以允许丢失数字,请将沙发上的uuid算法设置为sequential,至少在第一次缓冲区溢出之前,您是优秀的。有关更多信息,请访问:

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

只需在您的文档中发布,这将增加
rev
并返回它。然后,您可以将生成的值用于您的目的

替代方法:


创建一个单独的文档,由
value
lock
组成。然后执行类似这样的操作:“如果lock==true,则返回ELSE set lock=true并将值增加1”,然后执行GET以检索新的
,最后设置
lock=false

很遗憾,您的第一个建议不起作用,因为coach在更新文档时需要发送修订id。这是为了确保客户机拥有文档的最新版本,因此我需要首先获取文档以获得最新版本。我选择了另一种方法。但是,我没有使用文档来锁定数字的获取。相反,我使用了一些应用程序逻辑和coach的大容量插入文档的能力,这对于我的用例来说已经足够了。然而,我接受了你的回答,因为这似乎是正确的选择。