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

时间:2012-07-12 16:07:49

标签: filter pagination couchdb mapreduce

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

2 array keys

数组键中的第一个位置是user_id,第二个位置表示用户是否已阅读该消息。

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

  1. 在上图中注意,对于doc id 26a9a271de3aac494d37b17334aaf7f3 ,会发出两次[66,true]。据我所知,使用我的地图功能中的键,我无法以这样的方式减少返回的唯一文件。

  2. 我的下一个想法是在map函数中发出doc._id并使用group_level=exact缩小结果:

    3 array keys

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

  3. 我提出的最后一个想法是在数组键的第三个位置发出整个文档而不是doc._id,然后我可以访问整个文档并且可能是分页。这似乎真的很野蛮。

  4. 所以我的问题是:

    #3 高于一个可怕的想法?有什么我想念的吗?有更好的方法吗?

    提前致谢。

1 个答案:

答案 0 :(得分:0)

请参阅@ WickedGrey对该问题的评论。解决方案是确保我永远不会为一个文档两次发出相同的密钥。我在 map 函数中执行此操作,方法是在数组中发出键时跟踪键,然后在数组中存在键时跳过emit。