2012-04-26 73 views
1

我有一些问题,看起来像是一个相当直接的问题,在CouchDB 1.01中解决。我的数据基本上是从30个奇怪的诊所中抽出的药物日志以及有关该药物和时间戳的一些基本数据。我传递的对象相当普通组作为地图结果为减少伪形式:CouchDB减少 - 错误只是降序

Key:ClinicName, Value:{"vaccine":DrugType, "stamp":TimeStamp} 

我减少功能的目的是让每一个类型的药物的分配量的快速参考。

地图

function(doc) { 
    if(doc.type=="dose"){ 
    emit(doc.clinicName, {"vaccine":doc.vaccine,"stamp":doc.timestamp}); 
    } 
} 

减少

function(keys, values){ 
    var indexes = Object.keys(values); 
    var vCount = new Object; 
    for (var c in indexes){ 
    var val = values[c] 
    var vname = val.vaccine 
    if(vCount.hasOwnProperty(vname)){ 
     vCount[vname] = vCount[vname] + 1; 
    } 
    else{ 
     vCount[vname] = 1; 
    } 
    } 
    return vCount; 
} 

这完美的作品时,我有?关键=特定ClinicName只要降=虚假和组= TRUE。一旦下降到真,我的结果就会在中途切断。

两个问题:

  1. 为什么要为减少功能结果为了此事?随着减少,结果是相同的向前和向后。
  2. 我读过的地方,如果你的减少不提供一个标量,你可能做错了。如果抛开奇怪的行为,这是一种糟糕的做法,从日志式数据源呈现这类数据的正确方法是什么?
+0

作为未成年人的风格一点,我发现我减少“防御性”节目让事情使用CouchDB更容易。 CouchDB中的Javascript环境不像浏览器,充满未知脚本可能会改变全局值,原型等。例如:'if(vCount in vCount){' – JasonSmith 2012-04-27 00:53:57

+0

点好了。这是我最初收集时间戳的工件,而不是简单的计数。 – sarwar 2012-04-27 14:38:58

回答

1

如果你想知道每门诊疫苗量(计数),那么你需要的是,在关键的。

// pseudo-form 
Key:[ClinicName, DrugType], Value:{"stamp":TimeStamp} 

接下来,您的减少“功能”可以简单地是字符串"_count"

有了这个,你可以设置?group_level=2并且每个诊所每个疫苗获得一行,并且所有剂量的总和被分配。这可能与您无关,但您可以免费获得每个诊所(?group_level=1)的剂量(所有药物)的计数能力。

要获得总计所有诊所的疫苗计数,该观点必须仅针对该药物。

// pseudo-form 
Key:DrugType, Value:{"stamp":TimeStamp} 

主要的一点是,reduce必须始终在相邻的行上工作,在地图输出中彼此相邻。然后,您可以使用?group_levelstartkey/endkey获得有意义的结果。

+0

一如既往的优秀答案。如果改进后的设计不会改变违规行为,我会追加。 – sarwar 2012-04-27 14:40:44

+0

谢谢!我刚刚更新了答案,指出group_level = 1也可能有用,用于计算每个诊所给出的(所有疫苗的)总剂量。 – JasonSmith 2012-04-28 00:24:52

1

问题2的答案更容易。

“单标量”经验法则适合入门,但我看到许多高级应用程序完全像您一样使用对象。

例如,看到这个最近有关对象中总结了相关的值答案:https://stackoverflow.com/a/10082894/2938

0

杰森的回答非常好,而且对于任何人而言,我的根本问题是缺乏对如何减少工作的理解。

最重要的是,reduce函数的输出本身必须是可减少的,因为couchdb并行执行减少。如果您有1000行与某个键匹配,则沙发可能需要10组100个并将该功能应用于每个组。然后它将重新降低先前减少量的10个输出以达到键集的解决方案。

这也可能是最好的,你阅读文档...

Read the Reduce/Rereduce Sections of the CouchDB docs