【问题标题】:How to replicate documents from one database to another database and delete documents on the original database when replication is complete复制完成后如何将文档从一个数据库复制到另一个数据库并删除原始数据库上的文档
【发布时间】:2019-10-23 08:23:51
【问题描述】:

问题

我有一个使用 pouchDB 的客户端应用程序发送的录音数据库recordingsDB。每个录音都是它自己的文件。例如

{
  "_id": "2019-10-20T04:51:22.744Z",
  "_rev": "1-53e73be51ea76f96e3cfde2de1502439",
  "locale": "en",
  "_attachments": {
    "recordings.webm": {
      "content_type": "audio/webm; codecs=opus",
    ...
    }
  }
}

客户端应用程序有一个用户clientUser(因此访问该网站的任何人都变为clientUser)。因此,客户端用户可以写入recordingsDB,但也可以从recordingsDB 读取,这是不可取的,因为他们可以从recordingsDB 读取任何记录。

我走上了“只写”数据库之路,遇到了 2011 年的 this 答案。我想知道如何实现它。

想法

所以我相信如果我的recordingsDB 将所有录音复制到masterRecordingsDB 那里clientUser 不再是成员,那么我认为会起作用。将recordingsDB 中的每个文档复制到masterRecordingsDB 后,它将被删除。

设置

我已经配置了一个复制器,它将内容从recordingsDB复制到masterRecordingsDB。

{
  "_id": "recordings_to_master_recordings",
  "_rev": "3-a6fa84dd89c2ec037353c17f65b4c765",
  "continuous": true,
  "source": {
    "url": "http://localhost:5984/recordings",
    "headers": {
      "Authorization": "Basic YWRtaW46cGFzc3dvcmQ="
    }
  },
  "target": {
    "url": "http://localhost:5984/master_recordings",
    "headers": {
      "Authorization": "Basic YWRtaW46cGFzc3dvcmQ="
    }
  },
  "user_ctx": {
    "name": "admin",
    "roles": [
      "_admin"
    ]
  },
  "owner": "admin"
}

如何在每次复制成功后删除recordingsDB中的项目?

【问题讨论】:

  • 看来你应该已经有了更容易解决这个问题的方法。通常,位于 Internet 和 db 之间的应用服务器会强制执行 authn 和 auhtz。在您的示例中,应用服务器应该停止对属于其他人的数据的请求,返回 403 Forbidden 或其他内容。 app 用户与 db 用户相同。即你在这里是Eric-PNGK,但是stackoverflow应用服务器用来存储这个问题的db帐户是notEric-PNGK;它是一个系统级的 Microsoft Sql Server 帐户,受到应用服务器的严密保护。
  • 使用 CouchDB / PouchDB。每个用户都有自己的数据库。我必须避免这种情况,并将所有客户端都放在一个数据库上。因此,所有客户端都是同一个应用用户。为了帮助确保最终用户的匿名性,要求使用此功能。所以我相信在这种情况下所有客户端用户也是同一个数据库用户。
  • 您可以告诉 pouch db 将更改复制到主数据库,而不是相反。我的意思是您可以执行以下操作:localDB.replicate.to(remoteDB),因此只有本地更改会到达 couchDB,如果另一个用户在 couchDB 上更改/添加了某些内容,那么这将永远不会到达本地 pouch db。跨度>
  • @needsleep 这是真的,我们目前正在做的事情。问题是是否有人要找到此客户端用户的名称和密码。然后,他们可以使用 curl 访问录音数据库并获取所有用户的信息。

标签: database couchdb pouchdb couchdb-2.0


【解决方案1】:

我可以想到两种方法来解决您的问题。

通常,在 CouchDB 中,删除文档有点用词不当。当一个文档被删除时,由于 CouchDB 的只附加特性,给定文档的一个新版本被创建,仅由它的 ID、版本和字段 _deleted 组成,这是真的。这个所谓的“墓碑”允许在所有数据库中复制删除。但是,墓碑保留在数据库中并占用(尽管非常小)空间。您可以自己实现它,只需创建类似于{"_id": "0", "_rev": "1-62657917", "_deleted": true} 的文档修订版。需要注意的是,带有已删除标志的文档将不再在请求中返回。

第二个删除选项是purge。这将从数据库中永久删除对给定文档的所有引用。这不是 couchDB 中删除的标准格式,有关如何格式化清除请求的信息链接如下。

更多信息:

CouchDB Docs on Deletion

CouchDB Docs on Purge

最后,a helpful article about deletion in CouchDB

【讨论】:

  • 嗨卡森,谢谢你,但它没有回答我的问题。我知道如何删除 CouchDB 中的文档。我遇到的问题是如何在复制发生后立即自动删除文档。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-22
  • 1970-01-01
相关资源
最近更新 更多