3

我即将在CouchDB服务器端编写一个过滤器函数来过滤特定于用户的文档。此过滤器将仅允许对特定用户有权访问的少数选定文档进行复制,而不是对 TB 大小的整个数据库进行复制。

在这里,我发现了一个类似的问题CouchDB: Restricting users to only replication their own documents但它没有提供我需要的信息。

所以我的问题仍然存在:

  1. 指定此类过滤器的最佳方法是什么?
  2. 我应该如何编写这样的过滤器功能,任何书面示例?
  3. 我应该在每个文档中包含什么,以便过滤器以这种方式工作:

    在社交网络的上下文中,假设您想从服务器获取用户数据,例如图片,在这种情况下,包含图片的文档将保存userId在其中。但有时,这个人的朋友会访问他的个人资料,然后他们也可以查看这些照片。在这种情况下,每当朋友访问他的个人资料时,图片文档将被复制给朋友,他也将能够查看这些图片。

我怎样才能完成这样的过滤器?

更多信息在移动平台端,我使用的是 CouchbaseLite,而在服务器端,我使用的是 CouchDB。我只想在移动平台上过滤文档。

4

2 回答 2

6

CouchDB 过滤器功能只能访问被过滤的单个文档,因此您不能使用来自其他文档的任何信息。这排除了“类似加入”的方法,例如从照片发布文档取消引用到所有者文档以查找所有者的朋友列表。

基本上,您必须在每个文档中包含一个属性,该属性列出了应该获得它的确切用户集。

另外,请注意,这不提供任何类型的访问控制。无法选择性地拒绝对 CouchDB 中文档的读取访问权限,因此您无法阻止用户查看陌生人的相册。为此,您必须采用每用户数据库的方法,该方法有其自身的缺点——您最终必须在数据库之间设置大量复制以在它们之间共享文档,这不能很好地扩展.

看一下 Couchbase 同步网关 ( https://github.com/couchbase/sync_gateway)——它与 CouchDB 复制兼容,但添加了能够完全实现这种选择性同步和访问控制的功能。用它来实现社交网络肯定是可行的;这是我们设计它时考虑的用例之一。(我是该项目的首席工程师。)

于 2014-03-11T19:10:31.290 回答
2

您可以更改数据的结构,并创建许多在设备上复制的小型数据库和一个中央数据库,以便使用您实施的过滤器在这个小型数据库上进行复制。

通常这样做是为了让用户只能访问一些文档。

我认为您应该在包含它必须复制到的用户的文档中添加一个数组字段。

在中央数据库中,_replicate 为每个辅助数据库包含一个文档复制,每个辅助数据库都有其复制过滤器。

此过滤器检查必须复制文档的用户(从属数据库所属的用户)是否在 users 数组中。



否则,您是否考虑过使用 Couchbase + Sync Gateway?

于 2014-03-07T15:27:35.970 回答