有没有好的方法来替换集合中的所有 couchDB 对象?

Is there good way to replace all couchDB objects in a set?

我的一个节点服务器有一项工作是检查 FTP 中是否有 XML 文件,如果找到它,则将其转换为 JSON。现在它的工作是擦除 couchdb 数据库,并用 XML 文件中找到的所有新数据替换以前的数据。

现在,因为我不希望数据库在任何时候实际上都是空的(或不存在),所以我没有简单地销毁然后用新数据集重新创建它。我的节点服务器一直在从数据库复制到本地 pouchdb,擦除它(软删除),然后将所有新数据放入其中,然后复制到 couchdb 数据库。

似乎完全没有必要下载,应该有一种硬删除的方法。有什么方法可以简单地将当前 CouchDB 数据库中的所有对象替换为我的节点服务器将复制到它的一组新对象?

感谢您的帮助

CouchDB 将文档修订历史保存在树中,因此用较新版本替换文档(假设文档的 _id 为 'x')需要您知道现有修订的 _id/_rev 对或者能够更新它。

因此,如果您需要更新文档 'x',则必须

 // fetch the document first
 curl -X GET http://localhost:5984/mydb/x
 { "_id": "x", "_rev": "45-123", "name": "fred"}
 // to be able to update it
 curl -X PUT -d'{ "_id": "x", "_rev": "45-123", "name": "Fred Smith"}' http://localhost:5984/mydb/x
 { "ok": "true", "_id": "x", "_rev": "46-456"}

您可以重写您的工作以对每个已更改的文档执行此 GET/PUT 操作。

如果您需要在导入新数据之前擦除数据,则只需创建一个新数据库,例如"mydb2017-09-22",将数据导入其中,并告诉正在使用数据的应用程序使用 "mydb2017-09-22" 作为真实来源。然后您可以安全地删除以前的规范数据库。这避免了当前解决方案中的复制步骤。

当前 CouchDB 不支持清除,因为它会扰乱周围复制数据的实现。压缩是为了删除旧的、不需要的文档修订以保存space。

对您的问题一无所知,我建议查看 "one database per import" 解决方案,因为它允许您在导入完成后简单地在数据集之间切换,并通过删除旧数据库自行清理.