Filter couchdb-为发出非唯一两个数组键的视图检索唯一文档

Filter couchdb-为发出非唯一两个数组键的视图检索唯一文档,filter,pagination,couchdb,mapreduce,Filter,Pagination,Couchdb,Mapreduce,我在CouchDB的视图中有一个map函数,它为message类型的文档发出非唯一的两个数组键,例如 数组键中的第一个位置是用户id,第二个位置表示用户是否已读取消息 这很好,因为我可以设置include_docs=true并检索实际文档。但是,在这种情况下,我将检索重复的文档,正如您在上面的视图结果中所看到的那样。我需要能够编写一个可以查询的视图,以返回给定用户已读取的唯一消息。此外,我需要能够有效地对结果集进行分页 请注意,在上图中,[66,true]对于文档id 26a9a271de3a

我在CouchDB的视图中有一个map函数,它为
message
类型的文档发出非唯一的两个数组键,例如

数组键中的第一个位置是用户id,第二个位置表示用户是否已读取消息

这很好,因为我可以设置
include_docs=true
并检索实际文档。但是,在这种情况下,我将检索重复的文档,正如您在上面的视图结果中所看到的那样。我需要能够编写一个可以查询的视图,以返回给定用户已读取的唯一消息。此外,我需要能够有效地对结果集进行分页

  • 请注意,在上图中,[66,true]对于文档id 26a9a271de3aac494d37b17334aaf7f3发出两次。据我所知,使用map函数中的键,我无法以返回唯一文档的方式进行缩减

  • 我的下一个想法是在map函数中发出
    doc.\u id
    ,并使用
    group\u level=exact
    减少,结果是:

    现在我可以获得唯一的文档ID,但是如果不进行第二次查询,我就无法获得文档。即使是在第二个查询的情况下,像这样进行分页也需要很多复杂性(至少我认为是这样)

  • 我想到的最后一个想法是发出整个文档,而不是文档。_id在数组键的第三个位置,然后我可以访问整个文档并可能分页。这似乎真的很残忍

  • 所以我的问题是: 这是一个糟糕的主意吗?有什么我遗漏的吗?有更好的方法吗


    提前感谢。

    请参阅@wickedrey对问题的评论。解决方案是确保我不会为一个文档发出两次相同的键。我在map函数中执行此操作,方法是在阵列中发射关键点时跟踪这些关键点,然后在阵列中存在关键点时跳过发射。

    能否显示地图和缩小函数?不清楚为什么不能将映射函数更改为不发射重复项。@WicketdGrey我想这可能是答案。@WicketdGrey是正确的,我问题的解决方案是确保我发射了唯一的密钥。我这样做是通过跟踪为每个文档发出的键,并确保不会多次发出一个键。这应该是显而易见的,但我正在学习:)。