19

是否可以删除 couchdb 数据库中的所有文档(设计文档除外),而无需为此创建特定视图?

我的第一种方法是访问_all_docs标准视图,并丢弃那些以_design. 这可行,但是对于大型数据库来说太慢了,因为需要一次从数据库中请求文档(以获取文档修订版)。

如果这是唯一有效的方法,我认为删除整个数据库并从头开始创建它并再次插入设计文档更为实用。

4

3 回答 3

14

我能想到几个想法。

使用 _all_docs

您不需要获取所有文档,只需获取 ID 和修订。默认情况下,这就是 _all_docs 返回的全部内容。您可以批量提出一个相当大的请求(一次 10k 或 100k 文档应该没问题)。

复制然后删除

您可以使用_all_docs查询来获取所有设计文档的 ID。

GET /db/_all_docs?startkey="_design/"&endkey="_design0"

然后将它们临时复制到某个地方。

POST /_replicator

{ "source":"db", "target":"db_ddocs", "create_target":true
, "user_ctx": {"roles":["_admin"]}
, "doc_ids": ["_design/ddoc_1", "_design/ddoc_2", "etc..."]
}

现在您可以删除原始数据库并通过交换"source""target"值复制临时数据库。

删除与“删除”

请注意,这些实际上是苹果与橙子的技术。通过删除数据库,您将清除其所有文档的编辑历史记录。换句话说,您不能将这些删除事件复制到任何其他数据库。当您在 CouchDB 中“删除”一个文档时,它会存储该删除的记录。如果您复制该数据库,这些删除将反映在目标中。(CouchDB 存储指示文档 ID、修订历史和已删除状态的“墓碑”。)

这对你来说可能重要也可能不重要。第一个想法可能被认为更“正确”,但我可以看到第二个的价值。您可以在脑海中可视化整个程序以完成此操作。只需几个查询,您就完成了。没有循环_all_docs批次,没有头痛。您的具体情况可能会很明显哪个更好。

于 2012-04-16T16:24:00.880 回答
2

安装couchapp,将设计文档下拉到您的硬盘,删除蒲团中的数据库,将设计文档推回您重新创建的数据库。=)

于 2015-08-06T18:49:16.197 回答
1

您可以编写一个 shell 脚本来遍历所有文档的列表,然后将它们一一删除,除了设计文档。显然沙发批处理可以做到这一点。请注意,您不需要获取整个文档来执行此操作,只需获取 id 和修订版即可。

除此之外,我认为过滤复制(或 JasonSmith 提出的复制)是您最好的选择。

于 2012-04-17T04:22:10.390 回答