可以在Array的开头发出键有可选的数组参数吗?

时间:2014-09-12 13:32:33

标签: couchdb cloudant

我正在尝试设计一个可用于分析的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);
    }

}

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

我想知道的是 - 我可以将区域保留为可选区域或用户可选 以下是我想问这个map / reduce的一些查询。

1)2014年公司,区域和用户的所有活动是什么。 - 现在可以通过保留一些时间段参数来实现。

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

3)保持这些索引分开有什么优点和缺点。或者我应该? :)

1 个答案:

答案 0 :(得分: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)保持这些索引分开有什么优点和缺点。或者我应该? :)

这是一个很难回答的问题。我在这里唯一可以说的是你的索引应该回答你所拥有的具体问题。例如,基于您在上面索引中提出的问题,我会说您设计了好的索引,而不需要拆分它们。

那么什么是坏指数?

同样,坏索引是非特定索引。它试图回答许多问题,并且在任何问题上做得都不好。例如,将您的设计分为

没有意义
  1. 公司和日期索引
  2. 区域和日期索引
  3. 用户和日期索引
  4. 然后自己查询所有三个后汇总结果。单独地,所有三个索引对您来说都是无用的(假设),但只有当您汇总结果时才会获得有意义的东西。所以在这种情况下,您的单一索引方法要好得多。

    但我想你想要更多地了解性能影响。多个索引意味着将使用更多的磁盘空间。如果您已跨设计文档拆分索引,则甚至可以实现一定程度的并行性,因为每个设计文档将作为单独的进程执行。但除非该索引回答了您想要回答的问题,否则不要创建它。

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