删除 CouchDB 中的所有文档

Deleting all documents in CouchDB

我有一个数据库,我想截断所有记录,我知道可以只向每个文档添加一个 _deleted 键或在 CouchDB-python 库上调用 db.delete()。我正在使用 couchdb-python 的 delete,但是当我获取所有文档然后在除设计文档之外的每个文档上调用 .delete 时它似乎不起作用。

这是我的代码。

docs = get_db().view('_all_docs', include_docs=True)
for i in docs:
    if not(i['id'].startswith('_')):
        get_db().delete(i)

这是错误。因为 _all_docs 的结果返回 id 而不是 _id

File "C:\Users\User\AppData\Local\Programs\Python\Python36-32\lib\site-packages\couchdb\client.py", line 625, in delete
if doc['_id'] is None:
KeyError: '_id'

我的问题是如何获取 returns _id 而不仅仅是 id 的所有文档?或者有什么办法解决这个问题?

从 CouchDB 中删除您可以分两步创建的文档:

  • 创建视图(过滤要删除的文档)
  • 使用视图删除所有使用视图的文档

我为此写了一个tool

couchdb-pythonview 查询 returns couchdb.client.Row 对象列表,而不是文档列表。您需要将属性 doc 传递给 delete,即 get_db().delete(i['doc']).

然而,从性能角度来看,最好使用 bulk api。使用 couchdb-python 它应该看起来像这样:

rows = get_db().view('_all_docs', include_docs=True)
docs = []
for row in rows:
    if row['id'].startswith('_'):
        continue
    doc = row['doc']
    doc['_deleted'] = True
    docs.append(doc)
get_db().update(docs)