如何查询已删除的PouchDB文档?

7
我希望列出当前已删除的文档,以提供恢复一个或多个文档的能力。
我如何查询couchdb中已删除的文档?实际上我正在使用pouchdb。
尽管这篇文章很好地描述了如何查询和恢复文档,但它需要现有文档的id。
我正在寻找一种方法来查询所有已删除的文档。该POST引用了查询所有更改的方法。该查询返回所有已删除的文档以及任何已编辑/更改的文档。
我只想查找已删除的文档。类似于在“回收站”中查询文档。 :)

可能是检索刚刚删除的文档的重复问题。 - Jonathan Hall
目前我正在考虑为每个文档添加一个 deleted_at 日期时间值。这样我就可以模拟 Laravel 软删除功能。所有一般查询都将排除已设置 deleted_at 值的文档。除非有更优雅的本地实现方式。 - Larry Eitel
3个回答

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

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


请注意,不要更改html标签,并确保内容易于理解。

4
你可以在 PouchDB 的 _changes feed 中添加过滤器: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);
})

1

为了提供一个全能的解决方案,结合 this answer 中的 open_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() 将返回一个承诺,其中包含删除之前的 rev 对应的 所有 已删除文档的数组。

注意,数组的元素将包括 PouchDb 元数据以及您文档的键。

注意2,我在此使用的 pouchdb-browser 的 TypeScript 绑定版本为 6.1.3(尽管 @types/pouchdb 应该也可以使用),它似乎不知道 _revisions 键,因此需要使用 as any 转换。

注意3,手动将其转换为普通 JS 应该很简单,只需删除类型声明和强制转换 (:as,以及跟随这些标记的任何令牌)。


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