Определение представления испускает строковое поле из документа в качестве ключа. Значение поля может быть числовым или буквенно-цифровым. Запрос с использованием ключа со всеми числовыми значениями не возвращает ни одной строки, но буквенно-цифровой ключ возвращает данные.
На серверной веб-консоли и 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;