【问题标题】:Is there good way to replace all couchDB objects in a set?有没有好方法来替换一组中的所有 couchDB 对象?
【发布时间】:2017-09-22 21:51:13
【问题描述】:

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

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

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

感谢您的帮助

【问题讨论】:

  • 清除 + 压缩运行会定期修复软删除与硬删除问题吗?

标签: javascript node.js couchdb pouchdb nosql


【解决方案1】:

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 不支持清除,因为它会弄乱复制数据的实现。压缩是为了删除旧的、不需要的文档修订的主体以节省空间。

不了解您的问题的所有情况,我建议您查看“每次导入一个数据库”解决方案,因为它允许您在导入完成时简单地在数据集之间切换,并通过删除旧数据库自行清理。

【讨论】:

  • "如果您需要在导入新数据之前擦除数据,则只需创建一个新数据库,例如“mydb2017-09-22”,将数据导入其中并告诉应用正在使用数据来使用“mydb2017-09-22”作为事实来源”。 . . . .我如何能够告诉应用程序使用该数据库,当然最好使用应用程序同步的具有静态名称的数据库
  • 这取决于什么对你来说更重要。听起来您在复制有关该地点的数据时会遇到很多麻烦。我的建议是为每次导入创建一个干净的数据库,然后您的应用程序在准备好后切换到新数据库。它发挥了 CouchDB 的优势,可以很好地删除整个数据库,但在删除或更新文档时会留下数据。对您的问题的简短回答是,没有办法在不删除数据库并重新创建数据库的情况下替换集合中的所有文档,但这会导致一段时间内没有数据。
  • 好的,谢谢 Glynn,我将有一个静态命名数据库,其中包含一个对象告诉我的应用程序使用哪些数据库,以便我可以应用您的解决方案。下周我会回来的
猜你喜欢
  • 2012-03-12
  • 1970-01-01
  • 1970-01-01
  • 2022-12-14
  • 2020-08-31
  • 1970-01-01
  • 1970-01-01
  • 2018-12-11
  • 1970-01-01
相关资源
最近更新 更多