CouchDB过滤复制:首次完成复制后修改doc_id

时间:2011-11-16 18:15:22

标签: node.js couchdb replication npm

NPM(节点包管理器)注册表使用CouchDB在http://registry.npmjs.org/registry的CouchDB实例上存储包的元信息和tar包。我使用以下复制文档(CouchDB 1.1.0)来复制子集注册到我的公司CouchDB:

{ "_id": "fetch-npm-registry", "doc_ids": [ "coffee-script", "nodeunit" ], "source": "http://couchdb.mycompany.com:5984/registry", "target": "registry", }

[顺便说一下,处理此问题的CouchApp位于https://github.com/isaacs/npmjs.org(也有完整的安装说明)]。

如果我想在我的一个软件包中添加另一个依赖项,我天真的想法是我只修改doc_ids列表(比如说,["coffee-script", "nodeunit", "npm"])并再次开始复制。

不起作用:复制立即完成,我想要添加到复制的软件包(在本例中为"npm")丢失。

[我知道的解决方法是删除目标数据库,再次复制 - 因为我也使用这个本地注册表来发布我的专有包 - 重新发布我的本地包。 叹息


修正案18.11.2011

这就是我认为会发生什么(根本不是CouchDB内部专家,但可能有一些道理):

第一次成功复制后,CouchDB将它复制的最新文档的最后一个(最高?)序列ID 存储在数据库中的隐藏文档中(我曾经知道如何访问它们,欢迎指针)。然后,当我更改doc_ids时,此缓存的有关上次成功复制的信息(序列ID)未被无效(或清除)。然后,当它被告知使用相同的数据库再次复制时,它会比较序列ID 并确定一切正常。

2 个答案:

答案 0 :(得分:1)

1) http://registry.npmjs.org/registry不是注册表数据库,但http://registry.npmjs.org是。

2)

  

{“_ id”:“fetch-npm-registry”,“doc_ids”:[“coffee-script”,   “nodeunit”],“source”:“http://couchdb.mycompany.com:5984/registry”,   “target”:“registry”,}

您确定要从http://couchdb.mycompany.com:5984/registry而不是http://registry.npmjs.org复制吗?

答案 1 :(得分:0)

我尝试使用Couchbase Single Server 2.0 Developer Preview 5.它有效。我的curl命令是(但需要几分钟):

curl -X POST 'http://localhost:5984/_replicate' -H 'Content-Type: application/json' -d '{"doc_ids": [ "coffee-script", "nodeunit", "npm" ], "source": "http://registry.npmjs.org:5984/registry", "target": "registry", "create_target": true}

它基于一些Apache COuchDB主干版本。

请问您可以尝试使用Apache CouchDB 1.1.1。我记得有一个带有空ID的复制器错误(并且npm存储库有这样的文档),这是固定的。

干杯,   沃尔克