Couchbase Java SDK 1.4.7 цифровой ключ в представлении Запрос не возвращает результаты

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

На веб-консоли сервера и в остальных 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 Java SDK 1.4.7 Couchbase Server 3.0.3

Решение

На основании информации, приведенной в ответе ниже, ниже представлены два варианта

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

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

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

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

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

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

1 ответ

Решение

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

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

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

emit("" + doc.requestData.corelationId, ...);
Другие вопросы по тегам