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

NPM的(节点包pipe理器)registry使用CouchDB在http://registry.npmjs.org/registry的CouchDB实例中存储包的元信息和压缩包。我使用下面的复制文档(CouchDB 1.1.0)来复制registry子集到我的公司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" )的包丢失。

[我知道的解决方法是删除目标数据库,再次复制,因为我也使用本地registry来发布我的专有软件包 – 重新发布我的本地软件包。 叹气 ]


2011年11月18日修正

以下是我认为会发生什么(根本不是一个CouchDB内部专家,但也许有一些事实):

在第一次成功复制之后,CouchDB将最近复制的最新文档的最后一个(最高?) 序列ID存储在数据库的隐藏文档中(我曾经知道如何访问这些文档,欢迎使用指针)。 然后,当我更改doc_ids这个caching的信息关于最后一次成功的复制(序列ID)不失效(或清除)。 然后,当它被告知再次使用相同的数据库进行复制时,它会比较序列号并决定一切正常。

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

2)

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

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

我尝试了Couchbase单一服务器2.0开发人员预览版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存储库有这样一个文件),这是固定的。

干杯,Volker