如何在 pouchdb 中查询已删除的文档?

How can I query pouchdb for deleted documents?

我想列出当前已删除的文档,以便提供取消删除一个或多个文档的功能。

如何在 couchdb 中查询已删除的文档?我实际上正在使用pouchdb。

虽然 this POST 很好地描述了如何查询和取消删除文档,但它需要现有文档的 ID。

我正在寻找一种方法来查询所有已删除的文档。 POST 引用对所有更改进行查询。该查询 returns 所有已删除的文档以及任何已被删除的文档 edited/changed。

我只查找已删除的文档。考虑查询 'trash bin' 中的文档。 :)

从 couch 2.1.0 开始,您可以向 _changes 提要添加各种选择器。因此,您只输出已删除文档的请求将是:

curl -X POST -H "content-Type: application/json" "http://adm:pass@127.0.0.1:15984/tracks/_changes?filter=_selector" -d '{"selector": {"_deleted": true}}'

您可以向 PouchDB 中的 _changes 提要添加过滤器:https://pouchdb.com/api.html#filtered-changes

var changes = db.changes({
  filter: function(doc) {
    return doc._deleted;
  }
}).on('change', function(change) {
  console.log(change.id);
})

对于 all-in-one 解决方案结合了 this answeropen_revs 技巧,这是我想出的 TypeScript 代码:

const db = new PouchDB('my-db');

async function deletedDocIds(): Promise<string[]> {
  const ret: string[] = [];
  return new Promise((resolve, reject) => {
    db.changes({filter: d => d._deleted})
        .on('change', c => ret.push(c.id))
        .on('complete', () => resolve(ret))
        .on('error', e => reject(e));
  });
}

async function deletedDocs() {
  const ids = await deletedDocIds();
  return Promise.all(ids.map(id => db.get(id, {revs: true, open_revs: 'all'}).then(x => {
    const revs = (x[0].ok as any)._revisions;
    const lastRev = (revs.start - 1) + '-' + revs.ids[1];
    return db.get(id, {rev: lastRev}); // with Pouchdb keys too
  })));
}

调用 deletedDocs() 将 return 承诺 所有 已删除文档的数组 就在 [=32] 之前=]删除。

N.B,数组的元素将包括 PouchDb 元数据以及文档的键。

N.B。 2,我在这里使用的 pouchdb-browser 的 DefinitelyTyped 的 TypeScript 绑定版本 6.1.3(不过应该也适用于 @types/pouchdb)似乎不知道 _revisions 键,因此as any 逃生口。

N.B。 3,这对于手动转换为纯 JS 应该是微不足道的,只需删除类型声明和强制转换(:as 以及这些后面的任何标记)。