2017-04-26 69 views
1

我想,如下所述实施过程:PouchDB在成功复制删除文件CouchDB的

  1. 创建在设备中的文件sale_transaction
  2. sale_transaction文档放在邮袋中。
  3. 因为有袋&沙发之间的实时复制,让sale_transaction文件流沙发上。
  4. 一旦sale_transaction文档沙发的成功复制,删除袋文档。
  5. 请勿让袋中的deleted sale_transaction文档流过沙发。

目前,我已经在两个数据库中实现了双向同步,在这两个数据库中,我正在过滤从Couch到Pouch的每个文档,反之亦然。

对于从Couch复制到Pouch,我不想让sale_transaction文档通过,因为我只能从Couch获取这些文档。

PouchDb.replicate(remoteDb, localDb, { 
    // Replicate from Couch to Pouch 
    live: true, 
    retry: true, 
    filter: (doc) => { 
     return doc.doc_type!=="sale_transaction"; 
    } 
}) 

虽然从袋到沙发上复制,我把一个过滤器,不要让deleted sale_transaction证件办理。

PouchDb.replicate(localDb, remoteDb, { 
    // Replicate from Pouch to Couch 
    live: true, 
    retry: true, 
    filter: (doc) => { 
     if(doc.doc_type==="sale_transaction" && doc._deleted) { 
     // These are deleted transactions which I dont want to replicate to Couch 
     return false; 
     } 
     return true; 
    } 
}).on("change", (change) => { 
    // Handle change 
    replicateOutChangeHandler(change) 
}); 

我也实现了一个变化处理程序来删除袋的sale_transaction文件,写入到沙发后。

function replicateOutChangeHandler(change) { 
    for(let doc of change.docs) { 
     if(doc.doc_type==="sale_transaction" && !doc._deleted) { 
     localDb.upsert(doc._id, function(prevDoc) { 
      if(!prevDoc._deleted) { 
       prevDoc._deleted = true; 
      } 
      return prevDoc; 
     }).then((res)=>{ 
      console.log("Deleted Document After Replication",res); 
     }).catch((err)=>{ 
      console.error("Deleted Document After Replication (ERROR): ",err); 
     }) 
     } 
    } 
} 

数据的流动,似乎首先是工作,但是当我从沙发上sale_transaction文档,然后做一些编辑,我将不得不重复写入袋文档的过程,然后让它流向沙发,然后将其删除。但是,在用相同的文档进行一些编辑之后,Couch中的文档也被删除。

我相当新的袋子&沙发,特别是在NoSQL,并想知道如果我在这个过程中做错了什么。

+0

为什么不简单地在内存中编辑/创建文档,并将它们直接推送到CouchDB? –

+0

@AlexisCôté我正在考虑设备无法访问互联网的情况。因此,如果我将文档推送到Pouch,并且没有互联网连接,我依靠Pouch的本地复制将文档同步到Couch。 – aamiel16

回答

1

对于像您在上面所描述的情况,我建议调整你的方法如下:

创建PouchDB数据库从CouchDB的复制目标,但把这个数据库作为只读的CouchDB数据库的镜像,应用您需要的任何转换,以便从本地存储中删除某些文档类型。为了这个例子,我们称这个数据库为mirrormirror数据库仅通过变换复制从规范CouchDB数据库单向更新。

创建一个单独的 PouchDB数据库来存储所有的销售交易。为了我们这个例子,我们称这个数据库为user-data

当用户创建一个新的销售交易,本文件写入user-data。听取user-data上的更改,并在创建文档时,使用更改处理程序创建文档并将其直接写入CouchDB。

此时,CouchDB正在从user-data接收销售交易,但您的转换复制正在阻止他们污染mirror。您可以将其保留,在这种情况下,user-data将拥有所有销售交易的本地副本。在注销时,您可以删除user-data数据库。或者,您可以在更改处理程序中添加一些更复杂的逻辑以在CouchDB收到文档后删除文档。

如果你真的想变得花俏,你可以做更精心的事情。写入CouchDB后将销售事务处理保留在user-data中,并且在从CouchDB到mirror的变换复制中,查找这些新创建的销售事务处理文档。不要删除它们,只要将它们除去它们的_id_rev字段,然后将它们作为“收据”使用。当其中一个ID与user-data中的ID匹配时,可以安全删除该文档。

无论您选择哪种方法,我都建议您考虑将本地PouchDB的_changes供稿作为工作队列,而不是将所有这些复杂的逻辑放在复制过滤器中。上述方法应该都可以在离线情况下存在而不会引入冲突,并且在连接恢复时可以很好地恢复。我会推荐最后一个解决方案,尽管它可能比其他解决方案多一点。希望这可以帮助。