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, ...);