是否可以删除couchdb数据库中的所有文档,除设计文档外,而不为其创建特定视图?
我的第一种方法是访问_all_docs
标准视图,并丢弃以_design
开头的文档。这适用于大型数据库,但速度太慢,因为需要从数据库中请求文档(为了获得文档修订)。
如果这是唯一有效的方法,我认为删除整个数据库更为实际,并从头开始再次插入设计文档。
答案 0 :(得分:14)
我可以想到几个想法。
您无需获取所有文档,只需获取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存储" tombstones"表示文档ID,其修订历史记录及其删除状态。)
这对您来说可能重要,也可能不重要。第一个想法可能被认为更多"正确"但是我可以看到第二个的价值。您可以想象整个程序,以实现这一目标。这只是一些问题而且你已经完成了。没有循环_all_docs
批次,没有头痛。你的具体情况可能会明显哪个更好。
答案 1 :(得分:2)
安装couchapp,将设计文档下拉到硬盘,删除蒲团中的数据库,将设计文档推送回重新创建的数据库。 =)
答案 2 :(得分:1)
您可以编写一个shell脚本,该脚本遍历所有文档的列表,并逐个删除它们,除了设计文档。显然couch-batch可以做到这一点。请注意,您不需要获取整个文档来执行此操作,只需要获取ID和修订版。
除此之外,我认为filtered replication(或JasonSmith提出的复制)是你最好的选择。