我即将在CouchDB
服务器端上编写过滤功能,以过滤特定于用户的文档。此过滤器仅允许复制特定用户可访问的少数选定文档,而不是整个TB大小的数据库。
我在这里发现了一个类似的问题CouchDB: Restricting users to only replicating their own documents,但它没有提供我需要的信息。
我的问题仍然存在:
我应该在每个文档中包含哪些内容,以便过滤器以这种方式工作:
在社交网络的上下文中,假设您想从服务器获取图片等用户数据,在这种情况下,包含图片的文档将在其中保留userId
。但有时候,这个人的朋友可以访问他的个人资料,然后他们也可以查看这些照片。在这种情况下,每当朋友访问他的个人资料时,图片文档将被复制到朋友,他也将能够查看这些图片。
如何完成此类过滤?
更多信息:在移动平台方面,我使用的是CouchbaseLite,在服务器端,我使用的是CouchDB。我只希望在移动平台上过滤文档。
答案 0 :(得分:6)
CouchDB过滤器功能只能访问要过滤的单个文档,因此您无法使用其他文档中的任何信息。这排除了" join-like"方法,例如从照片发布文档解除引用到所有者文档以查找所有者的朋友列表。
基本上,您必须在每个文档中包含一个属性,列出应该获得它的确切用户集。
另请注意,这并未提供任何类型的访问控制。没有办法在CouchDB中有选择地拒绝对文档的读取访问权限,因此您无法阻止用户查看陌生人的相册。要做到这一点,你必须采用每用户数据库的方法,这有其自身的缺点 - 你最终必须在数据库之间设置大量的复制,以便在它们之间共享文档,而不是; t很好。
查看Couchbase同步网关(https://github.com/couchbase/sync_gateway) - 它与CouchDB的复制兼容,但添加了能够实现这种选择性同步和访问控制的功能。用它来实现社交网络绝对是可行的;这是我们设计时遇到的用例之一。 (我是该项目的首席工程师。)
答案 1 :(得分:2)
您可以更改数据的结构,并创建许多可在设备上复制的小型数据库和中央数据库,以使用您实施的过滤器在此小型数据库上进行复制。
这通常是为了使用户只能访问某些文档。
我认为你应该在包含必须复制的用户的文档中添加一个数组字段。
在中央数据库中,_replicate包含每个辅助数据库的一个文档复制,每个辅助数据库都有一个复制过滤器。
此过滤器检查必须复制doc的用户(辅助数据库所属的用户)是否位于users数组中。
否则,您是否考虑过使用Couchbase + Sync Gateway?