从 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));
}
}
我们使用 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));
}
}