我正在尝试设计一个可用于分析的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)保持这些索引分开有什么优点和缺点。或者我应该? :)
答案 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)保持这些索引分开有什么优点和缺点。或者我应该? :)
这是一个很难回答的问题。我在这里唯一可以说的是你的索引应该回答你所拥有的具体问题。例如,基于您在上面索引中提出的问题,我会说您设计了好的索引,而不需要拆分它们。
那么什么是坏指数?
同样,坏索引是非特定索引。它试图回答许多问题,并且在任何问题上做得都不好。例如,将您的设计分为
没有意义然后自己查询所有三个后汇总结果。单独地,所有三个索引对您来说都是无用的(假设),但只有当您汇总结果时才会获得有意义的东西。所以在这种情况下,您的单一索引方法要好得多。
但我想你想要更多地了解性能影响。多个索引意味着将使用更多的磁盘空间。如果您已跨设计文档拆分索引,则甚至可以实现一定程度的并行性,因为每个设计文档将作为单独的进程执行。但除非该索引回答了您想要回答的问题,否则不要创建它。
一个小建议。我偶然发现了@JasonSmith的这个answer,其中他提供了一些关于如何定位发射键的好建议。我认为你可以在那里改善你的发射结构。