couchDB排序复杂密钥

时间:2013-03-06 23:03:23

标签: couchdb

我有一个couchDB数据库,它有几个不同的文档“类型”,它们都与主“类型”有关。

在常见的博客/帖子示例中,主要类型是博客帖子,其他是评论(尽管有3种不同类型的评论。

所有类型都有日期,但是,我希望按日期对博客文章进行排序,但也会返回评论中的所有数据。我可以写一个像这样产生键的发射器:

[date, postID, docTypeNumber]

其中docTypeNumber为1并且为> 1表示不同的评论文档类型。

e.g:

["2013-03-01", 101, 1]
[null, 101, 2]
[null, 101, 2]
[null, 101, 3]
["2013-03-02", 101, 1]
[null, 102, 2]
[null, 102, 3]

当然,如果我发出这个,所有的空值都会一起排序。有没有办法忽略空值,并按数组中的第二项对它们进行分组,但是如果它不为空则按第一项排序?

或者,我是否必须获取所有文件来记录发布日期才能进行排序?

我不想使用列表,它们太慢了,而且我正在处理一个可能很大的数据集。

2 个答案:

答案 0 :(得分:0)

您可以在地图功能中使用条件来完成此操作。

if(date != null) {
  emit([date, postID, docTypeNumber]);
}
else {
  emit([postID, docTypeNumber]);
}

我不知道您是否希望数组长度可变。如果没有,您可以先添加排序变量。以下代码段可以工作,因为日期和postID可能永远不会有相同的值。

if(date != null) {
  sortValue = date;
}
else {
  sortValue = postID;
}
emit(sortValue, date, postID, docTypeNumber);

更新:我想到了这一点。通常,我根据我想要执行的查询来创建视图。所以我问自己,我需要查询什么?在您的情况下,您可能在这里有两个不同的查询。如果是这样,我建议有两种不同的观点。由于您运行两个视图而不是一个视图,因此需要支付性能损失,但我怀疑用户可以感知到它。它可能会占用更多的磁盘空间。为您带来的好处是更清晰,更明确的代码。

答案 1 :(得分:0)

您似乎想要使用帖子的日期对所有数据(包括帖子和评论)进行排序。由于在您的设计评论文档中不包含发布日期(仅评论日期),因此使用视图整理模式很困难。我建议更改数据库设计以使博客帖子ID有意义并包含日期,例如。与作者ID连接的日期。这样,如果您从帖子中发出[doc._id, doc.type]并从评论文档中[doc.post, doc.type]发出,则您将按日期对帖子和评论进行分组和排序。