2

Couchbase のインクリメント関数を使用して、定数 prefix を持つ変数キーにいくつかのカウンターを格納しますSomePrefix_。キーが で始まるすべてのドキュメントを取得するビューを定義しますSomePrefix_

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

ビューにクエリを実行すると"Mg==""MQ=="などの値が取得されます。.NET SDK は、ビューの結果を読み込んで整数にマップすることに失敗します。

回避策はありますか?

4

1 に答える 1

2

まず第一に、目的が何であるかによっては、ここではビューが最善のアプローチではない場合があります。すべてのキーがわかっている場合は、ビューではなく CRUD 操作を使用する方が高速です。reduce を使用してすべてのキーの平均または最大値を求める必要がある場合、またはキーが単純に不明な場合は、ビューを使用するのが正しい方法です。

Couchbase Server の内部カウンタは、JSON ではなくバイナリとして保存されます。その結果、ビュー エンジンはバイナリを base64 に変換します。ドキュメントがdecode( decodeBase64(doc))されるとASCIIコードになります。次に、これを使用して文字列に変換するString.fromCharCode(decode[i])必要があります。これは、各桁に対して順番に実行する必要があります。

たとえば、カウンター doc がの場合、デコードすると10 進文字列であるMg==ASCII コードが含まれます。502

このビューでうまくいくはずです。

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 に答える