Couchbase java sdk 1.4.7 数字键在视图中查询不返回结果
Couchbase java sdk 1.4.7 numeric key in view Query not returning results
视图定义从文档中发出一个字符串字段作为键。字段值可以全部为数字或字母数字。使用具有所有数值的键的查询不会 return 任何行,但字母数字键 returns 数据。
在服务器 Web 控制台和休息 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 热点 7。
Couchbase java SDK 1.4.7
Couchbase 服务器 3.0.3
Solution
根据下面答案中给出的信息,您有以下两个选择
选项 1 服务器端映射更改
如果你正在构建一张新地图,那就去做吧。协调您的密钥,使其始终为字符串 emit("" + doc.requestData.corelationId, ...);
如果您的视图已经存在,那么您现有的所有文档都不会立即更改。
选项 2 客户端更改
如果您像我一样无法使用选项 1,请在您的代码中协调您的密钥。它克服了 skd 将其视为数字的逻辑。
corelationId = StringUtils.isNumeric(corelationId)?"\""+corelationId+"\"":corelationId;
您的视图以其原始类型按原样发出 corelationId
。你说在文档中它在数值和字符串之间交替。
如果您将密钥作为 Long
传递给 SDK,它将起作用。
(我怀疑在网络 ui 中,您自然会在关键字段中输入 12345678
而不是 "12345678"
,因此您输入了正确的 equi在网络中使用 Long
的价值 UI)
如果您不知道要为您搜索的每个键使用的正确类型,请协调映射函数中的键类型,以便您知道始终使用字符串:
emit("" + doc.requestData.corelationId, ...);
视图定义从文档中发出一个字符串字段作为键。字段值可以全部为数字或字母数字。使用具有所有数值的键的查询不会 return 任何行,但字母数字键 returns 数据。
在服务器 Web 控制台和休息 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 热点 7。 Couchbase java SDK 1.4.7 Couchbase 服务器 3.0.3
Solution
根据下面答案中给出的信息,您有以下两个选择
选项 1 服务器端映射更改
如果你正在构建一张新地图,那就去做吧。协调您的密钥,使其始终为字符串 emit("" + doc.requestData.corelationId, ...);
如果您的视图已经存在,那么您现有的所有文档都不会立即更改。
选项 2 客户端更改
如果您像我一样无法使用选项 1,请在您的代码中协调您的密钥。它克服了 skd 将其视为数字的逻辑。
corelationId = StringUtils.isNumeric(corelationId)?"\""+corelationId+"\"":corelationId;
您的视图以其原始类型按原样发出 corelationId
。你说在文档中它在数值和字符串之间交替。
如果您将密钥作为 Long
传递给 SDK,它将起作用。
(我怀疑在网络 ui 中,您自然会在关键字段中输入 12345678
而不是 "12345678"
,因此您输入了正确的 equi在网络中使用 Long
的价值 UI)
如果您不知道要为您搜索的每个键使用的正确类型,请协调映射函数中的键类型,以便您知道始终使用字符串:
emit("" + doc.requestData.corelationId, ...);