Nosql CouchDB中集合补码的查询

Nosql CouchDB中集合补码的查询,nosql,couchdb,Nosql,Couchdb,我不确定CouchDB提供的功能是否有好的处理方法,但我想以某种方式提取特定键上两种不同文档类型集的相对补充 例如,假设我有表示users和posts的文档,它们都有一个(唯一的)username字段。有一个适当的验证,确保每个post中都有用户文档存在于用户名,但是可能有任何数量的post文档具有给定的用户名,不包括任何文档。创建一个统计每个用户名的posts数的视图非常简单。视图甚至可以通过在视图映射功能中为用户文档发出零post计数来包含零计数。但我想做的是检索没有相关帖子的用户列表 可以

我不确定CouchDB提供的功能是否有好的处理方法,但我想以某种方式提取特定键上两种不同文档类型集的相对补充

例如,假设我有表示
user
s和
post
s的文档,它们都有一个(唯一的)
username
字段。有一个适当的验证,确保每个
post
中都有
用户
文档存在于
用户名
,但是可能有任何数量的
post
文档具有给定的
用户名
,不包括任何文档。创建一个统计每个
用户名
post
s数的视图非常简单。视图甚至可以通过在视图映射功能中为
用户
文档发出零post计数来包含零计数。但我想做的是检索没有相关帖子的用户列表


可以构建我上面描述的视图并过滤客户端的零值结果,但在我的实际情况中,结果的数量可能非常非常大,有趣的结果在总数中所占的比例相对较小。有没有办法在服务器端执行此操作并检索出感兴趣的结果?

我将编写一个映射函数来迭代文档,并以0个帖子发送用户(或仅发送usersname)

然后我将编写一个列表函数来迭代map函数的结果,并按照您的意愿对它们进行格式化(JSON、csv等)


(我不会使用reduce函数来格式化结果,即使reduce函数在开发中似乎工作正常。这只是我自己从艰苦的过程中吸取的经验教训。)

我个人会在客户端进行过滤,直到出现性能问题。接下来我可能会使用Teddy的
\u filter
技术,所有这些都是相当标准的CouchDB内容

然而,我偶然发现(IMO)一种寻找集合补码的优雅方法。我在探险时描述过

基本思想 查找视图的非成员显然不能通过简单的查询(和直接的索引扫描)完成。但是,可以通过同时迭代两个查询结果,在恒定内存和线性时间内完成

一个查询用于所有可能的文档ID。另一个查询用于匹配文档(您不需要的文档)。重要的是,CouchDB对查询结果进行排序,因此您可以高效地计算补码

请参见上一个问题中的详细信息。基本思想是同时遍历两个(已排序)列表,当您说“嘿,这个文档id在完整的集合中列出,但在子集合中缺少,这是一个成功。”


(你不必查询所有文档,你只需要两个查询CouchDB:一个返回所有可能的值,另一个返回不计算的值。)

我考虑了一个列表函数,但是(a)每次底层数据发生变化时,仍然必须在整个视图中进行线性迭代,只需在服务器端而不是客户端进行迭代;以及(b)必须在内存中构建整个结果集。这会起作用,但我希望有更好的解决方案。原因列表函数具有奇怪的
while(row=getRow()){…}
stuff是在不生成整个结果的情况下启用迭代处理。如果行有0个POST,只需
send()
,否则不需要。仍然有一个O(n)时间问题,但没有空间问题。@jhs哦,你说得对。我不公平地将我的沮丧情绪投射到view
reduce
函数如何将函数返回值用于无辜的
列表
函数上。打得好!