2

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

这是我的代码。

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

这是错误。因为 from 的结果_all_docs是返回 aid而不是_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'

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

4

2 回答 2

1

在查询中返回对象列表couchdb-python,而不是文档列表。您需要将一个属性传递给它,即。viewcouchdb.client.Rowdocdeleteget_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)
于 2017-10-25T14:25:51.990 回答
0

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

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

我为此编写了一个工具

于 2017-10-23T07:39:09.160 回答