Couchbase与Cloudant CouchDB - 与Javascript的差异在减少

时间:2013-04-07 22:41:39

标签: javascript couchdb reduce cloudant

好的,整个周末我一直在为这个问题喋喋不休,我终于难倒了。我的reduce map func:

function(doc) {
 if(doc.primary_keys) {
    for(pi in doc.primary_keys) {
        var pk = doc.primary_keys[pi];

        for(row_i in doc.data) {
            var row = doc.data[row_i];
            if(row[pk]) {
                emit([row[pk]], doc._id);
            }
        }
    }
 }
}

我的观点减少了:

 function(keys, values) {
   var retval = {};

   for(var val_i in values) {
       var key = values[val_i];

       if(key in retval) {
           retval[key] += 1;
       } else {
           retval[key] = 1;
       }
    }

    return(retval);
 }

这是我的本地(Couchbase)CouchDB返回的内容:

key      value
["a"]    {test2: 1, test: 1}

但是这里的Cloudant回归:

key      value
["a"]        {[object Object]: 1, [object Object]: 1}

我怀疑有一些js env的区别,但是每个解决方案都会让我遇到同样的问题; Cloudant的值[val_i]的值是对象类型,我期望一个字符串。我不知道为什么。如果有帮助的话,我现在非常愿意重新减少。

为什么这些不同?

1 个答案:

答案 0 :(得分:4)

首先,您需要指定reduce函数在rereduce情况下的工作方式(http://wiki.apache.org/couchdb/Introduction_to_CouchDB_views有信息)。在Cloudant上,始终调用rereduce(将各种分片中的数据收集到最终视图结果中)。这就是你得到你所看到的回应的原因。

其次,看起来你正试图通过primary_key获取数据。通常,您希望使用内置的_sum函数 - 它比自定义js代码更快,_sum可以在Cloudant中使用对象。

第三,未减少的视图将自动包含doc._id,因此发出1以使_sum工作。