Couchbase java sdk 1.4.7 числовой ключ в представлении запрос не возвращает результаты

Определение представления испускает строковое поле из документа в качестве ключа. Значение поля может быть числовым или буквенно-цифровым. Запрос с использованием ключа со всеми числовыми значениями не возвращает ни одной строки, но буквенно-цифровой ключ возвращает данные.

На серверной веб-консоли и rest api я мог видеть строку, поэтому представление обновляется правильно и, следовательно, полагаю, что проблема связана с клиентом java sdk.

Ниже приведен код, который я использую для запроса.

CouchbaseClient couchBaseDAO; //  = initialize client.
String corelationId = "12345678";
Query query = new Query();
query.setKey(corelationId);
ViewResponse result = couchBaseDAO.query(queryConfig, query);
JSONArray jsonArray = new JSONArray();
if(result != null){
   for(ViewRow row: result){
     jsonArray.put(row.getValue());
   }
}
return jsonArray.toString();

Карта:

function(doc,meta) {
   if(doc!=null && doc.requestData!=null) {
      emit(doc.requestData.corelationId, [doc.request.id, doc.status]);
   }
}

Если я изменил ключ на буквенно-цифровой, он работает.

String corelationId = "ab-12-09-a-123";

Java HotSpot 7. Couchbase java sdk 1.4.7 Сервер Couchbase 3.0.3

Решение

Основываясь на информации, приведенной в ответе ниже, ниже представлены два варианта, которые у вас есть

Вариант 1 Изменение карты на стороне сервера

Если вы строите новую карту, дерзайте. Гармонизируйте свой ключ, чтобы он всегда становился строковым emit("" + doc.requestData.corelationId, ...);

Если ваше представление уже существует, все ваши существующие документы не изменятся сразу.

Вариант 2 Изменение на стороне клиента

Если вы похожи на меня, где вариант 1 невозможен, попробуйте согласовать свой ключ в своем коде. Он преодолевает логику skd и рассматривает его как числовой.

corelationId = StringUtils.isNumeric(corelationId)?"\""+corelationId+"\"":corelationId;

person Jags    schedule 19.01.2016    source источник
comment
какова именно ваша функция просмотра карты? также нет 1.7.x Java SDK ... Я предполагаю 1.4.7?   -  person Simon Baslé    schedule 20.01.2016
comment
@ SimonBaslé обновил вопрос с помощью карты и исправил версию java sdk. Нет функции уменьшения.   -  person Jags    schedule 21.01.2016


Ответы (1)


Ваш вид излучает corelationId как есть, в исходном виде. Вы сказали, что в документах чередуется числовое значение и строка. Если вы передадите ключ в SDK как Long, он будет работать.

(Я подозреваю, что в веб-интерфейсе вы, естественно, ввели 12345678 в поле ключа, а не "12345678", поэтому вы сделали правильный эквивалент использования Long в веб-интерфейсе)

Если вы не можете знать правильный тип, который следует использовать для каждого ключа, который вы ищите, гармонизируйте тип ключа в функции карты, чтобы вы всегда знали, что нужно использовать строки:

emit("" + doc.requestData.corelationId, ...);
person Simon Baslé    schedule 21.01.2016
comment
Это странно. Во время операции установки в моем Java POJO corelationid определяется как строковая переменная. Тогда почему сервер обрабатывает отдельные значения по-разному (в основном добавляя ненужный интеллект). Разве обработка представления сервера не должна определять, что значения являются строками на основе сканирования нескольких документов, и всегда рассматривать их как строку? - person Jags; 21.01.2016
comment
что делает сервер, так это то, что он сохраняет то, что вы испускаете в своей функции карты (на стороне сервера), создавая индекс. для сервера emit(123) и emit("123") - это две разные вещи, строгое сравнение равенства не будет соответствовать ... следовательно, необходимо решить это в функции карты. - person Simon Baslé; 21.01.2016
comment
Спасибо за руководство. Поскольку я не могу изменить представление (нет доступа и много существующих документов), я получил решение на стороне клиента. Я отредактировал свой вопрос с обоими решениями, чтобы людям было полезно выбирать то, что лучше из них. - person Jags; 23.01.2016