如何将文档从一个数据库复制到另一个数据库,并在复制完成后删除原始数据库上的文档



>问题

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

{
"_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 年遇到了这个答案。我想知道如何实现它。

想法

因此,我相信如果我的recordingsDB将所有录音复制到clientUser不再是成员的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"
}

如何在每次成功复制后删除录制数据库中的项目?

我能想到两种方法来解决你的问题。

通常,在CouchDB中,文档删除有点用词不当。删除文档时,由于 CouchDB 的仅追加性质,将创建给定文档的新修订版,仅包含其 ID、修订版和字段_deletedtrue。这个所谓的"逻辑删除"允许在所有数据库中复制删除。但是,逻辑删除仍保留在数据库中并占用(尽管非常小(空间。您可以自己实现这一点,只需创建看起来像{"_id": "0", "_rev": "1-62657917", "_deleted": true}的文档修订版即可。请务必注意,带有已删除标志的文档将不再在请求中返回。

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

更多信息:

关于删除的 CouchDB 文档

关于清除的 CouchDB 文档

最后,一篇关于在 CouchDB 中删除的有用文章

最新更新