【问题标题】:PouchDB - Lazily fetch and replicate documentsPouchDB - 懒惰地获取和复制文档
【发布时间】:2016-01-02 19:11:48
【问题描述】:

TL;DR:我想要一个类似于 Ember Data 的 PouchDB 数据库:首先从本地存储中获取,如果没有找到,则转到远程。在这两种情况下仅复制该文档。

我的 PouchDB/CouchDB 服务器中有一个名为 Post 的文档类型。我希望 PouchDB 查看本地存储,如果有文档,则返回文档并开始复制。如果没有,请转到远程 CouchDB 服务器,获取文档,将其存储在本地 PouchDB 实例中,然后开始仅复制该文档。 在这种情况下,我不想复制整个数据库,只复制用户已经获取的内容。

我可以这样写:

var local = new PouchDB('local');
var remote = new PouchDB('http://localhost:5984/posts');

function getDocument(id) {
  return local.get(id).catch(function(err) {
    if (err.status === 404) {
      return remote.get(id).then(function(doc) {
        return local.put(id);
      });
    }
    throw error;
  });
}

这也不能处理复制问题,但这是我想做的大方向。

我想我可以自己编写这段代码,但我想知道是否有一些内置的方法可以做到这一点。

【问题讨论】:

    标签: javascript couchdb pouchdb


    【解决方案1】:

    不幸的是,您所描述的并不完全存在(至少作为内置函数)。您绝对可以使用上面的代码从本地退回到远程(这是完美的顺便说一句:)),但是local.put() 会给您带来问题,因为本地文档最终会得到与远程文档不同的_rev,这以后可能会干扰复制(这将被解释为冲突)。

    您应该能够使用{revs: true} 获取带有修订历史记录的文档,然后使用{new_edits: false} 插入以正确复制丢失的文档,同时保留修订历史记录(这是复制器在后台执行的操作)。看起来像这样:

    var local = new PouchDB('local');
    var remote = new PouchDB('http://localhost:5984/posts');
    
    function getDocument(id) {
      return local.get(id).catch(function(err) {
        if (err.status === 404) {
          // revs: true gives us the critical "_revisions" object,
          // which contains the revision history metadata
          return remote.get(id, {revs: true}).then(function(doc) {
            // new_edits: false inserts the doc while preserving revision
            // history, which is equivalent to what replication does
            return local.bulkDocs([doc], {new_edits: false});
          }).then(function () {
            return local.get(id); // finally, return the doc to the user
          });
        }
        throw error;
      });
    }
    

    应该可以!让我知道这是否有帮助。

    【讨论】:

    • 谢谢!到目前为止,这对我有用。我想知道是否有一些方法也让它活起来?对不起,我应该让我原来的问题具体说明。
    • 没关系!看起来我可以使用 doc_ids 选项pouchdb.com/api.html#replication
    • 是的,doc_ids 完全符合您的要求;我想这就是你所说的“生活”吗?例如,一旦用户请求文档,将其添加到“所需”文档 ID 列表中,然后永远复制这些文档 ID?
    猜你喜欢
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 2019-05-13
    相关资源
    最近更新 更多