【问题标题】:Couchdb filter using reduce functions/linked documents使用减少功能/链接文档的 Couchdb 过滤器
【发布时间】:2023-03-19 19:05:01
【问题描述】:

考虑: 文档资料 { _id:"1", name:"john", likes: ["2222","1111"] }

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

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

我的 xamarin 应用程序上有一个过滤器来获取配置文件,它运行良好,但我需要包含“儿童”(链接)文档...我可以通过视图设置 include_docs=true 来做到这一点,但我想要couchdb 进行过滤,以便我可以使用复制。 此外,如果我可以使用 reduce 函数过滤数据,也可以实现相同的结果,但我不能让过滤器使用 reduce 函数。那么,有什么想法吗?

预期的结果是:

文档资料 { _id:"1", name:"john", likes: { {_id:"2222", value:"true"}, {_id:"1111", value:"false"] } }

谢谢!

【问题讨论】:

    标签: couchdb xamarin.forms couchdb-futon


    【解决方案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 函数将 key、value 和 rereduce 参数作为输入。如果你使用reduce函数作为post map处理步骤来进一步过滤视图中的结果会有两个问题:

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

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

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

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

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

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

    【讨论】:

    • 感谢您提供非常有用的信息!我想使用复制,但如果我不能为此使用它,我可以使用什么?休息?或者有其他方法吗?
    • 很高兴您发现它很有用。复制有很多用途。 The guide 很好地概述了它的用途。
    • 绝对不建议在该用例中使用列表作为过滤器。当配置文件数量增加时,这将导致严重的性能问题。相反,具有多部分键的视图是一个可靠的解决方案。该索引只能基于配置文件文档。视图地图功能将为每个文档发出多次 - “父”配置文件文档一行,每个喜欢项目一行。最后一个小技巧让它变得完美 - 在 likes-rows 的值中发出属性_id。然后,当使用include_docs=true 时,此行将附加原始的 likes-doc(而不是 profile-doc)
    • 是的。与视图相比,列表函数的性能很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 2018-08-19
    • 2023-04-05
    相关资源
    最近更新 更多