Couchbase java sdk 1.4.7数字键视图查询不返回结果

时间:2016-01-19 21:55:15

标签: couchbase-java-api

视图定义从文档中发出字符串字段作为键。字段值可以是全数字或字母数字。使用具有所有数值的键进行查询不返回任何行,但字母数字键返回数据。

在服务器Web控制台和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 Server 3.0.3

  

解决方案

根据以下答案中给出的信息,以下是您有两个选项

选项1 服务器端地图更改

如果您要构建新地图而不是为此而建。协调你的密钥,使其始终成为字符串emit("" + doc.requestData.corelationId, ...);

如果您的观点已经存在,则所有现有文档都不会立即更改。

选项2 客户端更改

如果您像我一样无法选择选项1,请在代码中协调您的密钥。它克服了skd将其视为数字的逻辑。

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

1 个答案:

答案 0 :(得分:1)

您的视图以原始类型发出Long。你说在文档中它是在数值和字符串之间交替。 如果您将密钥作为12345678传递给SDK,则可以使用。

(我怀疑在网络上你自然地在关键字段中输入了"12345678"而不是Long,所以你做了正确的等效使用emit("" + doc.requestData.corelationId, ...); in网页用户界面

如果您无法知道要搜索的每个键使用的正确类型,请在地图函数中协调键类型,以便始终知道使用字符串:

public boolean isEmpty(Object[] array) {
   for (Object s : array) {
      if (s == null) return true;
   }
   return false;
}