使用reduce函数/链接文档的Couchdb过滤器

时间:2015-06-04 11:56:54

标签: couchdb xamarin.forms couchdb-futon

考虑到: doc个人资料 { _id:"1", name:"john", likes: ["2222","1111"] }

doc喜欢 { _id:"2222", value:"true" }

{ _id:"1111", value:"false" }

我的xamarin应用程序上有一个过滤器来获取配置文件,它运行良好,但我需要包含"孩子" (链接)文档...我可以使用视图设置include_docs = true来执行此操作,但我希望couchdb过滤,以便我可以使用复制。 此外,如果我可以使用reduce函数来过滤数据,则可以实现相同的结果,但是我不能使过滤器使用reduce函数。那么,任何想法?

预期结果将是:

doc个人资料 { _id:"1", name:"john", likes: { {_id:"2222", value:"true"}, {_id:"1111", value:"false"] } }

谢谢!

1 个答案:

答案 0 :(得分:1)

  

我可以使用视图设置include_docs = true来执行此操作但我希望couchdb过滤以便我可以使用复制

您可能已经知道这一点但可以使用couchdb views as filters

  

此外,如果我可以使用reduce函数来过滤数据

,则可以实现相同的结果

reduce函数用于减少" map函数返回的值。 map函数返回一个键和一个值,如下所示:

emit(key,value)

reduce函数仅获取从map函数返回的键和值。例如,如果使用

调用视图

?key=abc

并返回

之类的结果
[{
_id:...,
type: abc
},
{
_id:...,
type:abc
}
....
]

您已经按键" abc"过滤了所有文件。 reduce函数将获取键,值和rereduce参数作为输入。如果使用reduce函数作为后映射处理步骤来进一步过滤视图中的结果,则会出现两个问题:

  1. 无法将参数传递给reduce。您指定的键仅由map函数使用,然后按原样传递以进行缩减。

  2. 无论如何,这不是一个好主意。使用reduce时,您希望返回一个小值,该值汇总从视图中获得的结果。因此,如果您返回上面的示例,则将一个整数表示为map函数( in emit(key,value)//suppose that the value is an integer)中的值,reduce函数可以返回这些值的总和或汇总。但是尝试返回修改后的文档并不是reduce函数的用途。来自the docs

  3.   

    " reduce函数必须将输入值减小到较小的输出值。如果要在reduce中构建复合返回结构,或仅转换值字段,而不是对其进行汇总,则可能会滥用此功能。 "

    List functions可能更适合您要做的事情。如果要在返回视图查询之前处理它们的结果,那么它们就是可行的方法。

    在列表函数中,您将获得视图函数返回的一组结果。如果您想在其上应用复杂的过滤器,您甚至可以传递其他参数。但是你无法使用列表函数进行复制。

    最后复制适用于文档级别。文档具有_rev字段,复制器进程使用这些字段来检查在执行复制之前文档的版本。因此,您无法复制视图返回的结果。仅复制文档。