从couchbase视图获取计数器文档

时间:2015-05-22 07:52:31

标签: c# .net couchbase couchbase-view

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

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

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

有任何解决方法吗?

1 个答案:

答案 0 :(得分:2)

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

Couchbase服务器计数器的内部存储为二进制而不是JSON。因此,视图引擎将二进制文件转换为base64。当doc解码时(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));
  }
}