从 couchbase 视图获取柜台文件

Get counter documents from couchbase view

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

开头的文档
function (doc, meta) {
  if (meta.id.indexOf("SomePrefix_") === 0) {
    emit(meta.id, doc);
  }
}

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

有什么解决方法吗?

首先,视图可能不是最佳方法,具体取决于 objective 是什么。如果所有键都是已知的,那么使用 CRUD 操作而不是视图会更快。如果要求是使用 reduce 来查找所有键的平均值或最大值,或者键是简单的未知,那么视图是正确的方法。

Couchbase 服务器内部计数器存储为二进制而不是 JSON。结果,视图引擎将二进制转换为 base64。当文档被解码 (decodeBase64(doc)) 时,它将成为 ASCII code。然后需要使用 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));
  }
}