2013-03-06 90 views
0

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

在普通博客/后例子,主要类型是博客文章,和其他人的意见(虽然有3种不同类型的注释。

所有类型的对他们有日期,但是,我想按日期博客文章进行排序,但返回所有从评论中的数据,以及我可以写它产生的密钥像这样的EMIT:

[date, postID, docTypeNumber] 

其中docTypeNumber为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] 

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

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

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

回答

0

您可以通过在地图功能中使用条件来执行此操作。我不知道你是否希望你的数组长度是可变的或不是。如果不是,可以先添加排序变量。下面的代码片段可以工作,因为日期和postID大概从来没有相同的值。

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

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

+0

感谢您的回复。我想我在这里错过了一些东西。有了第一个选项,它不是按数组中的第一项进行排序吗?如果不是,它如何知道通过postID排序?我对你的回答感到非常兴奋,如果你是对的,couchDB对我来说更好。 – ddouglascarr 2013-03-07 09:48:52

+0

我觉得我更喜欢第一种形式的第二种形式。但是,第一个仍然有效。您对帖子的视图整理实际上是'[101,x]'。您对日期的查看整理将会沿着'[2013-03-07,x,x]'的方向进行。你也可以按日期和帖子查询'[2012-03-07,101,x]'。请注意,这两个视图取决于postID和日期从不具有相同值的事实。 – 2013-03-07 22:13:12

+0

查询视图时,两个选项都不起作用。它从数组的前面进行排序,因此它将帖子的postID与评论的日期进行比较。列出您的所有帖子ID,然后列出您的所有帖子。有没有一个选项可以在查询视图时使其不同? – ddouglascarr 2013-03-08 21:47:35

0

看来你想排序所有的数据(包括文章和评论)与职位的日期。由于在您的设计中,评论文档不包含发布日期(仅评论日期),因此查看整理模式很困难。我建议改变数据库设计,使博客帖子ID有意义并包含日期,例如。与作者ID连接的日期。通过这种方式,如果您从发布文章中发布[doc._id, doc.type]并从发布文档中发布[doc.post, doc.type],您将按照日期分组发布和评论。