【问题标题】:How can I query pouchdb for deleted documents?如何在 pouchdb 中查询已删除的文档?
【发布时间】:2018-01-20 07:31:27
【问题描述】:

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

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

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

我正在寻找一种方法来查询所有已删除的文档。 POST 引用了对所有更改的查询。该查询返回所有已删除的文档以及任何已编辑/更改的文档。

我只查找已删除的文档。考虑在“垃圾箱”中查询文档。 :)

【问题讨论】:

  • 此时我正在考虑为每个文档添加一个 deleted_at 日期时间值。使用它我可以模拟 Laravel 软删除功能。我所有的一般查询都会排除具有 deleted_at 值的文档。除非有更优雅的方式来实现这一点。

标签: couchdb pouchdb


【解决方案1】:

从沙发 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}}'

【讨论】:

    【解决方案2】:

    您可以向 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);
    })
    

    【讨论】:

      【解决方案3】:

      对于结合 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() 将返回一个由 所有 个已删除文档组成的数组的承诺,根据 之前 的修订版删除。

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

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

      注意3,这应该很容易手动转换为纯 JS,只需删除类型声明和强制(:as 以及这些后面的任何标记)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-24
        • 1970-01-01
        • 1970-01-01
        • 2020-01-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多