PouchDB删除所有文档的JavaScript方法

19

我是pouchdb的新手,不太理解它的API。

我想知道用JavaScript代码删除所有文档的最佳方法是什么。我尝试了许多方法,但似乎都不起作用。

我是否需要在allDocs方法中使用某些选项,例如:

db.allDocs({include_docs: true, deleted: true})
6个回答

28
抱歉API太令人困惑了!如果您能告诉我们如何改进它,那将非常有帮助。 :)
您可以选择执行 db.destroy(),这会完全删除数据库但不会复制删除操作,或者逐个执行remove()删除所有文档:
db.allDocs().then(function (result) {
  // Promise isn't supported by all browsers; you may want to use bluebird
  return Promise.all(result.rows.map(function (row) {
    return db.remove(row.id, row.value.rev);
  }));
}).then(function () {
  // done!
}).catch(function (err) {
  // error!
});

```


这段代码有效吗:db.allDocs().then(function(response) { var doc; for (doc in response.rows) { return db.remove(doc); } }); - K20
你需要使用 Promise.all() 而不是 for 循环 - 否则只会删除第一个。我强烈推荐观看这个指南中的视频:http://pouchdb.com/guides/async-code.html - nlawson
抱歉回复晚了。关于如何提高对网站的理解,我不是很清楚,但我认为您高估了用户的知识水平。我在PouchDB方面真的很新,阅读了您的网站后,花了很多时间进行研究。此外,示例是针对非常特定的情况制作的,当我想做一些有所不同的事情时,我完全迷失了。也许这只是我的印象,但我认为所有的词汇都没有被描述清楚。 - K20
1
我非常努力地让PouchDB对新手友好,但其中一些概念确实很难,这是事实。:( 很抱歉我不能让它更容易理解。如果你尝试使用Babel的ES7,你可能会发现异步编程对初学者来说更加友好:http://pouchdb.com/2015/03/05/taming-the-async-beast-with-es7.html - nlawson
3
以防将来有人偶然遇到这段代码。@nlawson的代码是有效的,只是缺少一个右括号来关闭.all(函数调用。以下是方便您使用的代码:db.allDocs()。then(function(result){return Promise.all(result.rows.map(function(row){return db.remove(row.id,row.value.rev);}); }).then(… - Uzbekjon
这是最好的答案!谢谢! - Alexie01

7

根据nlawson的回答,您还可以使用bulkDocs,这样您就不必为每个文档运行Pouch操作:

db.allDocs({include_docs: true}).then(allDocs => {
  return allDocs.rows.map(row => {
    return {_id: row.id, _rev: row.doc._rev, _deleted: true};
  });
}).then(deleteDocs => {
  return db.bulkDocs(deleteDocs);
});

1
你可以销毁并重新创建它。

使用 destroy()

var db = new PouchDB('mydb');

var reset = function() {
  db.destroy().then(function() {
    db = new PouchDB('mydb');
  });
};

重置
reset()

0

如果 Promise 不可用,您可以使用回调函数及计数器来通知所有行已被删除。

db.allDocs().then(function(_response){
    var toBeDeleted = _response.rows.length;
    _response.rows.forEach(function(row){
        db.remove(row.id, row.value.rev, function(err, success){
            if(err){
                console.error(err);
            }
            else if(success){
                console.log("document with id %s was deleted", row.id);
            }
            if(--toBeDeleted == 0){
                console.log("done");
            }
        });
    });
});

0
db.allDocs({ include_docs: true }).then(response => {
  let documents = response.rows.map(res => {
    return {
      _id: res.id,
      _rev: res.value.rev,
      _deleted: true
    }
  });

  db.bulkDocs(documents, (err, response) => {
    if (!err) { console.log('Documents deleted successfully!'); } else {
      console.log('Documents could not be deleted');
    }

  })
})

2
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

-1

如果您使用pouchdb-erase npm包,那么这将变得很容易。该链接展示了如何在nodejs中使用它,但是我已经在angular 2中使用它,并且它非常好用。以下是我的一些代码。

import * as PouchDB from 'pouchdb';
@Injectable()
export class DBProvider {
  private _db;
  private _data;

  constructor() {
    window["PouchDB"] = PouchDB;//Debugging
    PouchDB.plugin(require('pouchdb-erase'));
  }

truncate(){
    this._db.erase().then(res=>{
        console.log(res);
    }).catch(err=>{
console.log(err);
    });
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接