在CouchDB中更改UUID算法

3
这个问题是关于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服务。当我再次查询一批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命令。 - Akshat Jiwan Sharma
谢谢Akshat!显然我把配置放在了错误的文件中,这真的帮了我很多。 - user3614014
2个回答

3

有一些事情你可以检查。

  1. 你是否添加了另一个配置文件?你可以在couchdb中链接配置文件,如果你只修改了链中的最后一个文件,那么只会使用最后一个文件中的更改。

  2. 调用http://localhost:5984/_config/uuids获取有关couchdb所使用的uuid算法的信息。你应该得到如下结果:

{"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将抛出运行时异常,你必须手动更改配置文件。


1
再次感谢你,Akshat。虽然我最终是手动在配置文件中解决了问题,但你的帮助对我很有帮助。 - user3614014

2
作为解决问题的一个稍微不同的方法,您可以在写入文档之前为每个文档设置自己的 _id。我建议使用这种方法而不是相信 CouchDB 的自动生成算法来正确排序。
例如,您可以在客户端系统中使用 UUID 生成器,并在生成的 UUID 中添加索引。在 Python 中,我会使用 UUID 库。我认为您应该能够找到几乎所有语言的 UUID 生成器。
_id 看起来像 <索引值>_ 只要是新文档,您可以选择任何 _id 值。
我经常为可能相关的文档使用确定性文档 ID。想象一下,我可能有一个“客户”文档,其中包含一些客户信息,我还存储了一个该客户交易历史记录的“客户历史记录”文档。我可能会给我的客户文档命名为
Customer_14567ad352f-351979ffe12,然后让他的历史文档
Customer_14567ad352f-351979ffe12_History
另一种方法,因为您说“我想能够有效地根据某种时间索引对数据库中的文档进行排序以供以后检索”。
这就是视图的用途。因此,您可以编写一个视图来按您想要的时间索引组织文档。最简单的视图可能如下所示:
function(doc)
{
    emit( doc.TimeIndex, null );
}

谢谢您的回复,但我真的不想这样做。这对于我的当前环境也不可能。我希望couchdb能够正常工作! - user3614014
当然,这很公平。另外我添加了另一个答案,可能是问题所在? - wallacer
谢谢你的另一个答案,我很感激你的建议,不久以后我会使用它。还有一个问题,你的另一个回答...你能用它来同时处理多个couchdb数据库吗,还是只能处理一个? - user3614014
你可以将同一个视图放在你想要使用它的每个数据库中。实际上,视图只是以一种特殊类型的文档形式存储在数据库中,告诉数据库构建视图。视图是你用来以各种有趣的方式组织和索引数据库中数据的工具。它们非常方便,是CouchDB数据设计的核心。你应该阅读关于它们的资料:http://wiki.apache.org/couchdb/Introduction_to_CouchDB_views - wallacer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接