【问题标题】:Changing the UUID algorithm in CouchDB更改 CouchDB 中的 UUID 算法
【发布时间】:2014-08-10 08:29:57
【问题描述】:

本题参考couchdb 1.5.0版

就我的环境而言,我希望能够有效地对数据库中的文档进行排序,以便以后根据某种时间索引进行检索。我在网上读到,在 couchdb 中有四种用于创建 uuid 的算法。

此处列出了显示可用于生成 uuid 的算法的文档:http://couchdb.readthedocs.org/en/latest/config/misc.html#uuids-configuration

我怀疑默认 uuid 算法设置是“顺序的”,当发出 http://couchdb:5984/_uuids?count=50 时,我发现其中大部分(如果不是全部)前 26 位是相同的,后 6 位是唯一的。

我尝试将算法更改为 utc 选项之一(“utc_random”或“utc_id”都可以),其中前 16 位是 Unix 纪元的十六进制时间(以微秒为单位)。

我用来更改 UUID 算法的方法是进入 local.ini 文件并附加以下节(以前没有):

[uuids] algorithm = utc_random

然后我重新启动 couchdb 服务

service couchdb restart

当我再次查询一批 UUID 时,我仍然得到一个似乎表明正在生成的 uuid 仍在顺序算法中的结果。 (当我在此之后第二次查询 50 个 uuid 时,会注意到“顺序”算法行为)

我做错了吗?任何可以提供的帮助将不胜感激!

更新

在尝试了 Akshat Jiwan Sharma 建议的 curl 命令后,我又深入研究了配置文件并找到了一个 default.ini 文件。这是似乎设置了 uuids 参数的文件,我用 'utc_random' 替换了 'sequential',重新启动了 couchdb 服务,一切都按预期工作。为了找到 couchdb 的配置文件,我使用了一个简单的命令行 couchdb -c 再次感谢大家的帮助,你们太棒了!

【问题讨论】:

  • 你能检查一下 couchdb 是否真的在获取配置文件中所做的更改吗?试试curl http://localhost:5984/_config/uuids?
  • 谢谢阿克沙特!显然我把配置放在了错误的文件中,这对我很有帮助。

标签: algorithm couchdb uuid


【解决方案1】:

您可以检查几件事。

  1. 您是否添加了另一个配置文件?您可以在 couchdb 中链接配置文件,如果这样做,则只会使用链中最后一个文件的更改。

  2. 调用 http://localhost:5984/_config/uuids 以获取有关 couchdb 使用的 uuid 算法的信息。你应该得到类似

  3. 的结果

{"algorithm":"utc_random","max_count":"1000"}

您可以验证 couchdb 是否已获取您的配置。

您还可以通过 rest api 更改配置文件。这将有助于调试,因为您不需要再次重新启动 couchdb。这种方法的好处是只会更改相关的配置文件。

你可以这样做

curl -X PUT http://localhost:5984/_config/uuids/algorithm -d '"utc_random"'

请注意,如果您想要更改的参数中有拼写错误,例如 ramdom 而不是 random(我实际上输入了那个!)couch db 将引发运行时异常,您必须求助手动更改配置文件。

【讨论】:

  • 再次感谢 Akshat,这最终帮助我解决了我的问题,尽管我最终在配置文件中手动完成。
【解决方案2】:

作为解决问题的一种稍微不同的方法,您可以在编写文档之前在每个文档中设置自己的 _id。我建议使用这种方法而不是信任 CouchDB 自动生成算法来正确排序。

例如,您可以在客户端系统中使用 UUID 生成器,并将索引添加到生成的 UUID。在 python 中,我会使用UUID library。您应该能够为我认为的几乎所有语言找到 UUID 生成器。

_id 看起来像 _

只要是新文档,您可以选择任何您想要的 _id 值。

我经常将确定性文档 ID 用于可能相关的文档。想象一下,我可能有一个包含一些客户信息的“客户”文档,并且我还存储了一个包含该客户交易历史的“客户历史”文档。我可能会给我的客户文档表格

Customer_14567ad352f-351979ffe12 然后制作他的历史文档

Customer_14567ad352f-351979ffe12_History

另一种方法,因为您说“我希望能够有效地对数据库中的文档进行排序,以便以后根据某种时间索引进行检索”

这就是视图的用途。因此,您可以编写一个视图来按您想要的时间索引来组织文档。这样做的最简单的视图是:

function(doc)
{
    emit( doc.TimeIndex, null );
}

【讨论】:

  • 感谢您的回复,但我并不想这样做。这对于我当前的环境也是不可能的。我想让 couchdb 工作!
  • 当然,这很公平。添加了另一个可能是问题的答案?
  • 感谢您的其他回答,感谢您的意见,很快就会使用它。问题,你的另一个答案……你能用它来同时处理多个 couchdb 数据库还是一个?
  • 你可以在每个你想使用它的数据库中放置相同的视图。视图实际上只是作为一种特殊类型的文档存储在数据库中,告诉数据库构建视图。视图是您用来以各种有趣的方式组织和索引数据库中的数据的工具。它们非常方便,是 CouchDB 数据设计的核心。你应该阅读他们wiki.apache.org/couchdb/Introduction_to_CouchDB_views
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-21
相关资源
最近更新 更多