我刚刚开始使用CouchDB(2.1),我打算用它将机密的每用户数据从移动应用程序复制到我的服务器。我已经读过每个用户数据库是最好的方法,我已经设置了它。每个数据库都混合了用户创建的类型为Foo
和Bar
的文档。
现在,我还希望能够将多个用户的数据片段一起收集到一个数据库中,并在其上构建视图以进行管理员报告。假设我想要一个包含所有用户的所有Foos
的数据库。到目前为止,_replicator
中的条目从每个用户数据库到一个目标的过滤器完成了这项工作。
但是看看组合数据库,我无法分辨给定Foo来自哪个用户。我可以将用户ID写入每用户数据库中的每个文档,但这似乎是多余的,并增加了验证的复杂性。还有其他办法吗?
答案 0 :(得分:1)
CouchDB的复制器只是试图匹配目标数据库中给定文档的确切状态 - 如果不能,则无论如何都会存储±确切的源内容(作为冲突版本)。
此外,复制系统用来检查文档是否需要更新的文档的_rev
字段实际上是基于(哈希)其他文档字段。
很遗憾,您无法在复制期间添加元数据。这对于这个和其他per-user vs. shared replication情况确实很方便,但它不是CouchDB目前支持的东西,它会破坏一些优化以增加对它的支持。
我可以将用户ID写入每个用户数据库中的每个文档,但这似乎是多余的,并增加了验证的复杂性。还有其他办法吗?
在每个文档中包含类似.user
字段的内容是正确的解决方案。
就多余而言,我不会那么想 - 或者至少不是坏事。你会发现CouchDB(和其他NoSQL商店一样)有一种趋势是“反规范化”数据开始。特别是考虑到复制让我在操作和体系结构上做的事情,我宁愿拥有一个独立的文档,而不是依赖于从数据库名称派生的元数据的文档。
我不确定在你的情况下,额外的字段将如何使验证更复杂,所以我无法完全说明这一点。你做想要确保编写文档的用户“诚实地”设置它,所以是的,有更多的复杂功能,但在大多数情况下通常不会太繁琐。