Получить встречные документы с дивана

Мы используем функцию приращения Couchbase для хранения некоторых счетчиков на переменных ключах с постоянным префиксом SomePrefix_. Мы определяем представление, которое получает все документы, ключи которых начинаются с SomePrefix_:

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

Когда мы запрашиваем представление, мы получаем такие значения, как "Mg==", "MQ==" и т. д. .NET SDK не может загрузить результаты представления и сопоставить их с целыми числами.

Любые обходные пути?


person ilyabreev    schedule 22.05.2015    source источник
comment
Какие версии .NET SDK?   -  person Paddy    schedule 22.05.2015
comment
Похоже, что механизм просмотра обрабатывает счетчик как двоичный и преобразовал его в base64.   -  person Paddy    schedule 22.05.2015
comment
Ага. Они имеют кодировку base64. Пакет SDK для .NET 2.0 (пакет NuGet версии 2.0.2)   -  person ilyabreev    schedule 22.05.2015


Ответы (1)


Прежде всего, представление может быть не лучшим подходом здесь, в зависимости от цели. Если все ключи известны, то быстрее будет использовать операцию CRUD, а не представление. Если требования заключаются в том, чтобы использовать сокращение, чтобы найти среднее или максимальное значение всех ключей, или ключи просто неизвестны, тогда представление - правильный способ сделать это.

Внутренние счетчики Couchbase Server хранятся в двоичном формате, а не в формате JSON. В результате механизм просмотра преобразует двоичный код в base64. Когда документ будет декодирован (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));
  }
}
person Paddy    schedule 25.05.2015
comment
Я создал улучшение дефект для этого в Couchbase Server. - person Paddy; 25.05.2015
comment
В моем случае ключи простые не известны. Вот почему представление является единственным решением. Спасибо за подробное объяснение проблемы. И за тикет, который вы открыли на Couchbase Server :-) - person ilyabreev; 26.05.2015