0

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

在服务器 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;
4

1 回答 1

1

corelationId您的视图按原样发出原始类型。您说在文档中它在数值和字符串之间交替。如果您将密钥作为 a 传递给 SDK,Long它将起作用。

(我怀疑在 web ui 中你自然会12345678在 key 字段中输入而不是"12345678",所以你做了正确的等价Long于在 web UI 中使用 a )

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

emit("" + doc.requestData.corelationId, ...);
于 2016-01-21T09:50:55.800 回答