2

我们使用 Couchbase 的增量函数将一些计数器存储在具有常量前缀的变量键上SomePrefix_。我们定义了获取所有以键开头的文档的视图SomePrefix_

function (doc, meta) {
  if (meta.id.indexOf("SomePrefix_") === 0) {
    emit(meta.id, doc);
  }
}

当我们查询视图时,我们会得到诸如 等值"Mg=="。.NET "MQ=="SDK 无法加载视图结果并将其映射到整数。

任何解决方法?

4

1 回答 1

2

首先,根据目标的不同,视图可能不是最佳方法。如果所有键都知道,那么使用 CRUD 操作而不是视图会更快。如果要求使用 reduce 来找到所有键的平均值或最大值,或者键是简单未知的,那么视图是正确的方法。

Couchbase 服务器内部的计数器存储为二进制而不是 JSON。结果,视图引擎将二进制转换为 base64。当文档被 decode( decodeBase64(doc)) 时,它将是一个ASCII 码。然后需要将其转换为字符串,String.fromCharCode(decode[i])这需要依次为每个数字完成。

例如,如果计数器文档是Mg==,当它被解码时,它将具有 ASCII 码50,即十进制字符串2

这种观点应该可以解决问题。

function (doc, meta) {
  if (meta.id.indexOf("counter_") === 0) {
    var decode = decodeBase64(doc);
    var value = null;
    for (i = 0; i < decode.length; ++i) {
      if (value == null) {
        value = String.fromCharCode(decode[i]);
      } else {
        value += String.fromCharCode(decode[i]);
      }
    }
    emit(meta.id, parseInt(value));
  }
}
于 2015-05-25T16:16:26.780 回答