1

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

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

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

[date, postID, docTypeNumber]

其中 docTypeNumber 对于 post 为 1,对于不同的评论文档类型为 > 1。

例如:

["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]

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

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

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

4

2 回答 2

1

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

于 2013-03-07T10:40:30.367 回答
1

您可以通过在 map 函数中使用条件来做到这一点。

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

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

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

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

于 2013-03-06T23:49:56.150 回答