【问题标题】:Deleting all documents in CouchDB删除 CouchDB 中的所有文档
【发布时间】:2018-04-03 16:34:22
【问题描述】:

我有一个数据库,我想截断所有记录,我知道可以为每个文档添加一个 _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'

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

【问题讨论】:

  • 你为什么要这个?删除并重新创建数据库不是更容易吗?
  • 如果我删除数据库,那么我必须重新创建所有视图?那正确吗?抱歉,我对 Couch 还很陌生。 @Flimzy
  • 是的。但希望你有一个简单的方法来做到这一点。
  • 删除时需要使用 i['id'] 吗?
  • 这就是问题所在,我需要 _id' 进行删除,但 Couch 正在返回 'id'。 @Istvan

标签: python-3.x couchdb couchdb-python couchdb-2.0


【解决方案1】:

couchdb-python 中,view 查询返回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)

【讨论】:

  • 太棒了。我认为添加 _deleted 会起作用。谢谢你。这非常有效。
【解决方案2】:

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

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

我为此写了tool

【讨论】:

  • 似乎有点复杂,我希望它以 python 为中心。
  • 我也是这样做的,而且经常遇到资源冲突的异常。我现在正在考虑如何避免这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-04
  • 1970-01-01
相关资源
最近更新 更多