2014-09-12 53 views
2

我想设计一个我们可以用于分析的couchdb地图函数,我们的地图函数看起来像这样。可以发射键在数组的开始有可选的数组参数吗?

function (doc) { 
    var t; 
    var year; 
    var date; 
    var month; 

    var hours, minutes, seconds, milliSeconds; 
    if (doc.time && doc.zone && doc.user && doc.companyCode) { 
     t = new Date(Date.parse(doc.time)); 
     year = t.getFullYear(); 
     month = t.getMonth() + 1; 
     date = t.getDate(); 


     milliSeconds = t.getMilliseconds(); 
     //We emit this in the same sequence for group level queries. 
     emit([doc.companyCode, doc.zone, doc.user, doc.eventtype, year, month, date], 1); 
    } 

} 

我正在使用组级别,它工作得很好。

我想知道的是 - 我可以保留区域可选在这个或用户可选 这里是一些我想问这个地图/减少的查询。

1)2014年公司,区域和用户的所有事件是什么? - 通过保留一些时间参数是可选的,现在可以做到这一点。

2)我们可以问相同的查询某一年的事件是什么?我想在2014年找出公司代码的事件。我想让区域和用户可选。

3)保持这些指标分开的优点和缺点是什么?还是应该? :)

回答

2

要得到你的结果你想要范围查询。

1)2014年公司,区域和用户的所有事件是什么? - 通过保留一些时间参数可选,现在可以做到这一点。

?startkey=["company","zone","user","event",2014]&endkey=["company", "zone", "user", "event", 2014,{},{}]

,这将让你在2014年

我们可以问相同的查询什么是某年的事件为一家公司,区和用户的所有事件?我想在2014年找出公司代码的事件。我想让区域和用户可选。

当然这里去

?startkey=["company",null,null,null,2014]&endkey=["company", {}, {}, {}, 2014,{},{}]

,这应该给你一个公司代码和2014年

3)有什么优点VS缺点,以保持这些索引事件分离。还是应该? :)

这是一个难以回答的问题。我唯一能说的就是您的索引应该回答您的具体问题。例如,根据您对上述索引提出的问题,我会说您已经设计了好的索引,并且不需要将它们拆分。

那么什么是坏指数?

同样的道理,一个不好的索引是一个不确定的索引。它试图回答很多问题,并且在任何问题上都做得不好。例如有在分裂你的设计没有点到

  1. 公司和日期指标
  2. 区和日期指标
  3. 用户和日期指标

,然后汇总后的结果自己查询他们三个人。单独的所有三个指标对你来说都是无用的(假设),但只有当你汇总结果时你才会得到一些有意义的结果。所以在这种情况下,您的单一索引方法要好得多。

但我想你想知道更多关于性能的含义。多个索引意味着会使用更多的磁盘空间。如果你在设计文档中拆分索引,甚至可以达到一定程度的并行性,因为每个设计文档都将作为一个单独的过程来执行。但是,除非该索引回答了你想要回答的问题,否则不要创建它。

一个小建议。我偶然发现了@JasonSmith的这个answer,他在这里提供了一些关于如何定位发射键的好建议。我认为你可以在那里改善你的排放结构。

+1

谢谢您的详细消息。之后我会执行并将其标记为答案。 – 2014-09-12 18:39:05

相关问题