1

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

2个数组键

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

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

  1. 请注意上图中的 [66, true] 为 doc id 26a9a271de3aac494d37b17334aaf7f3发出了两次。据我所知,使用 map 函数中的键,我无法减少返回唯一文档的方式。

  2. 我的下一个想法是doc._id也在 map 函数中发出并减少,group_level=exact结果是:

    3 个数组键

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

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

所以我的问题是:

上面的#3是一个糟糕的主意吗?有什么我想念的吗?有更好的方法吗?

提前致谢。

4

1 回答 1

0

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

于 2012-07-16T20:06:10.640 回答