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

使用reduce函数/链接文档的Couchdb过滤器,couchdb,xamarin.forms,couchdb-futon,Couchdb,Xamarin.forms,Couchdb Futon,考虑到: 文档配置文件 { _id:“1”, 姓名:“约翰”, 喜欢:[“2222”,“1111”] } 博士喜欢 { _身份证号码:“2222”, 价值:“真实” } { _id:“1111”, 值:“false” } 我在我的xamarin应用程序上有一个过滤器来获取配置文件,它工作得很好,但我需要包括“儿童”(链接)文档。。。我可以通过视图设置include_docs=true来实现这一点,但我希望couchdb进行筛选,以便使用复制。 另外,如果我可以使用reduce函数来过滤数据,那么

考虑到: 文档配置文件
{
_id:“1”,
姓名:“约翰”,
喜欢:[“2222”,“1111”]
}

博士喜欢
{
_身份证号码:“2222”,
价值:“真实”
}

{
_id:“1111”,
值:“false”
}

我在我的xamarin应用程序上有一个过滤器来获取配置文件,它工作得很好,但我需要包括“儿童”(链接)文档。。。我可以通过视图设置include_docs=true来实现这一点,但我希望couchdb进行筛选,以便使用复制。 另外,如果我可以使用reduce函数来过滤数据,那么也可以实现相同的结果,但是我不能让过滤器使用reduce函数。。你知道吗

预期结果将是:

文档配置文件
{
_id:“1”,
姓名:“约翰”,
喜欢:{
{u id:“2222”,
值:“true”},
{u id:“1111”,
值:“false”]
}
}

谢谢

我可以通过视图设置include_docs=true来实现这一点,但我希望couchdb进行筛选,以便使用复制

您可能已经知道这一点,但可以使用

此外,如果我可以使用reduce函数来过滤数据,也可以实现相同的结果

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

emit(键、值)

reduce函数只获取map函数返回的键和值

?key=abc

它返回的结果如下

[{
_id:...,
type: abc
},
{
_id:...,
type:abc
}
....
]
您已经使用“abc”键筛选了所有文档。reduce函数将获取键、值和reduce参数作为输入。如果将reduce函数用作后期映射处理步骤,以进一步筛选视图中的结果,则将出现两个问题:

  • 无法将参数传递给reduce。您指定的键将仅由map函数使用,然后按reduce的方式传递

  • 无论如何,这不是一个好主意。使用reduce时,您希望返回一个小值来聚合从视图中获得的结果。因此,如果您从映射函数
    (在emit(key,value)//中)返回一个整数作为值,则以上面的示例为例
    reduce函数可能返回这些值的总和或总和。但是尝试返回修改过的文档不是reduce函数的目的。从

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

    可能更适合您尝试执行的操作。如果您希望在返回视图查询的结果之前对其进行处理,那么它们就是最佳选择

    在列表函数中,您将获得由view函数返回的一组结果。如果您希望对其应用复杂筛选器,您甚至可以传递其他参数。但您将无法使用列表函数进行复制


    最后,复制在文档级别上工作。文档具有_rev字段,在执行复制之前,replicator进程将使用这些字段检查文档的版本。因此,您将无法复制视图返回的结果。只有文档才会被复制。

    感谢您提供的非常有用的信息!我不想这样做o使用复制,但如果我不能使用它,我可以使用什么?REST?或者有其他方法吗?很高兴您发现它很有用。复制有很多用途。很好地概述了它的用途。在这种情况下,绝对不建议使用列表作为过滤器。当配置文件运行时,这将导致严重的性能问题t引发。相反,具有多部分键的视图是一个可靠的解决方案。索引只能基于配置文件文档。视图映射函数将为每个文档发出几次“父级”的一行配置文件文档,每个喜欢的项目也有一行。最后一个小技巧使它变得完美-在喜欢的行的值中发出属性
    \u id
    。然后这一行将有原始的喜欢的文档(而不是配置文件文档)当使用
    include\u docs=true
    时附加。与视图相比,列表函数的性能很好。