【问题标题】:Couchbase vs Cloudant CouchDB - differences with Javascript in reduceCouchbase 与 Cloudant CouchDB - 在 reduce 中与 Javascript 的差异
【发布时间】:2013-04-29 18:03:55
【问题描述】:

好吧,我整个周末都在绞尽脑汁想办法解决这个问题,但我终于被难住了。我的reduce map函数:

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 的 values[val_i] 值是 Object 类型,我希望它是一个字符串。我不知道为什么。如果有帮助,我很愿意在这一点上重新减少。

为什么这些完全不同???

【问题讨论】:

  • 虽然您所看到的有点奇怪(尽管它们都有共同的传统,但不再保证兼容性),但我会尝试 Cloudant 的支持选项。
  • 你说得对 WiredPrairie、Couchbase 和 Couchdb 是 2 个不同的项目。
  • 很好,谢谢大家。我是一个 js 初学者,只需要知道我不会发疯。我会在收到 Cloudant 支持后报告我的发现。

标签: javascript couchdb reduce cloudant


【解决方案1】:

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

其次,您似乎正在尝试通过 primary_key 获取数据计数。通常,您希望为此使用内置的 _sum 函数 - 它比自定义 js 代码更快,并且 _sum 可以处理 Cloudant 中的对象。

第三,未缩减的视图将自动包含 doc._id,因此发出 1 来代替 _sum 工作。

【讨论】:

  • 谢谢!是的,我试图发出一个值作为值在每个文档中出现的次数的计数。所以字段值是发出的键,我使用参数 ?key="foo" 进行查询,我想在每个文档中获取键“foo”的计数,即 {document1 : 3, document2 : 5}。感谢您提供有关分片的信息,太好了。现在完全有道理,但让我完全困惑!
  • 酷,很高兴你现在明白了 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-11
  • 2011-01-05
  • 1970-01-01
  • 2020-09-14
  • 1970-01-01
相关资源
最近更新 更多