couchDB排序复合键

couchDB排序复合键,couchdb,Couchdb,我有一个couchDB数据库,它有几个不同的文档“类型”,它们都与主“类型”相关 在常见的博客/帖子示例中,主要类型是博客帖子,其他类型是评论(尽管有3种不同类型的评论) 所有类型都有日期,但是,我希望按日期对博客文章进行排序,但同时返回评论中的所有数据。我可以编写一个emit,生成如下键: [date, postID, docTypeNumber] 其中,对于post,docTypeNumber为1;对于不同的注释文档类型,docTypeNumber大于1 e、 g: 当然,如果我发出这个,

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

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

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

[date, postID, docTypeNumber]
其中,对于post,docTypeNumber为1;对于不同的注释文档类型,docTypeNumber大于1

e、 g:

当然,如果我发出这个,所有的空值都会被排序在一起。有没有一种方法可以忽略这些空值,并按数组中的second项对它们进行分组,但如果不是空值,则按第一项对它们进行排序

或者,我是否必须获取所有文件来记录发布日期,以便排序工作


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

您可以通过在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);

更新:我考虑了一下。一般来说,我是根据我想要执行的查询来创建我的视图的。所以我问自己,我需要查询什么?在你的情况下,你可能会有两个不同的查询。如果是这样,我建议有两个不同的视图。因为你会运行两个视图而不是在上运行,所以需要支付性能惩罚e、 但我怀疑用户是否能感觉到它。它可能会占用更多的磁盘空间。对您来说,这样做的好处是代码更清晰、更明确。

似乎您希望将所有数据(包括帖子和评论)按帖子日期排序。因为在您的设计注释文档中不包含帖子日期(仅包含评论日期)视图排序模式很困难。我建议更改数据库设计,使博客帖子ID有意义并包含日期,例如,将日期与作者ID连接起来。如果您从帖子和
[doc.post,doc.type]发出
[doc.\u ID,doc.type]
,则使用这种方式
从评论文档中,您将按日期对帖子和评论进行分组和排序。

谢谢您的回复。我想我这里遗漏了一些东西。对于第一个选项,它不是按数组中的第一项排序吗?如果不是,它如何知道按帖子排序?如果您是对的,我真的很兴奋您的回答对我来说更好。我想我更喜欢第二个表单而不是第一个表单。但是,第一个表单仍然有效。你的帖子视图排序规则实际上是
[101,x]
。你的日期视图排序规则应该是
[2013-03-07,x,x]
。你也可以按日期和帖子进行查询
[2012-03-07,101,x]
。请注意,这两个视图都取决于postID和date的值不相同这一事实。当我查询视图时,这两个选项都不起作用。它从数组的前面排序,因此它会比较帖子的postID和评论的日期。列出了所有帖子ID,然后列出了所有帖子。是否有一个选项可以在查询时传递查询视图以使其不同?我明白了。我以为您正在尝试做一些不同的事情,并使用键查询视图。现在我明白您希望整个视图按帖子日期排序。我看到两个选项:1)将帖子日期存储在注释中;或者2)遵循Marcin的建议,使post ID有意义。
if(date != null) {
  sortValue = date;
}
else {
  sortValue = postID;
}
emit(sortValue, date, postID, docTypeNumber);