CouchDB PouchDB删除设备上数据而不影响远程同步

hgqdbh6s  于 2022-12-09  发布在  CouchDB
关注(0)|答案(2)|浏览(171)

现在,我正在将整个设备数据库复制到远程数据库。
完成后,我使用过滤器从远程数据库中获取不超过1个月的所有数据,并将其带到我的设备上。

过滤器

{
  _id: '_design/filters',
  "filters": {
    "device": function(doc, req) { 
      if(doc.type == "document" || doc.type == "signature") { 
        if(doc.created >= req.query.date) return true;
        else return false;
      } 
      else return true;
    }
  }
}

复制

device_db.replicate.to(remote_db)
.on('complete', function () {

  device_db.replicate.from(remote_db, {

    filter: "filters/device", 
    query_params: { "date": (Math.floor(Date.now() / 1000)-2419200) }

  })
  .on('complete', function () {

    console.log("localtoRemoteSync replicate.to success");
    callback(true);

  });

});

我的问题:

我希望能够定期从我的设备中删除超过3个月的数据(足够旧的数据,我已经知道它已经同步)
但是,就因为我从我的设备中删除了它,当我将数据复制回我的remote_db时,我不希望它也在那里被删除。
如何删除设备上的特定数据,但在复制时不转换该删除?

dtcbnfnu

dtcbnfnu1#

过滤器

这里,我们有两个筛选器:
noDeleted:此过滤器不推送 _deleted 文档。
device:筛选以仅获取最新数据。

{
  _id: '_design/filters',
  "filters": {
      "device": function(doc, req) {
          if (doc.type == "document" || doc.type == "signature") {
              if (doc.created >= req.query.date) return true;
              else return false;
          }
          return true;
      },
       "noDeleted": function(doc, req) {
          //Document _deleted won't pass through this filter.
          //If we delete the document locally, the delete won't be replicated to the remote DB 
          return !doc._deleted;
      }
  }
}

复制

device_db.replicate.to(remote_db, {
      filter: "filters/noDeleted"
  })
  .on('complete', function() {
      device_db.replicate.from(remote_db, {
              filter: "filters/device",
              query_params: { "date": (Math.floor(Date.now() / 1000) - 2419200) }
          })
          .on('complete', function() {
              console.log("localtoRemoteSync replicate.to success");
              callback(true);
          });
  });

工作流程

1.推送所有文档,而不推送已删除的文档。
1.您可以获得最新数据的所有更新

  • 删除旧文档
  • 您可以查询远程数据库以获取太旧的文档的ID,然后在本地将其删除。请注意,这些文档仍将以 _deleted 的形式存在。要完全删除它们,需要进行压缩。
  • 您也可以在步骤1之后完全销毁本地数据库,然后从头开始。
  • 回叫(真);
ezykj2lf

ezykj2lf2#

添加一个单向过滤的复制。但是,任何你需要回到服务器上的东西,你都需要使用一个put请求和服务器的_rev
比如说
1.从服务器复制到客户端,然后向要复制的文档添加一个筛选机制,如transfer:true。复制

db.replicate.from(remoteDB, {
 live: true,
 retry: true,
 selector: {transfer:true}// or any other type of selector
 });

1.要删除客户端上的文档,请将transfer设置为false,然后在客户端上删除它。它将不满足您的筛选条件,因此不会复制。
1.您想要放回服务器的任何内容都使用put请求而不是replicate。
1.如果您希望文档返回到客户端,只需在文档中将transfer设置为true。

相关问题