如何使用JavaAPI查询Couchbase

如何使用JavaAPI查询Couchbase,couchbase,couchbase-java-api,Couchbase,Couchbase Java Api,我试图从Couchbase示例啤酒样本中查询 此查询在Couchbase浏览器UI中运行良好: select category, style from `beer-sample` where style like 'Imperial%' 结果: [ { "category": "North American Ale", "style": "Imperial or Double India Pale Ale" }, ... ] [ {"cryptoManager":nu

我试图从Couchbase示例啤酒样本中查询

此查询在Couchbase浏览器UI中运行良好:

select category, style from `beer-sample` where style like 'Imperial%'
结果:

[
  {
    "category": "North American Ale",
    "style": "Imperial or Double India Pale Ale"
  },
...
]
[
{"cryptoManager":null,"empty":false,"names":["style","category"]},{"cryptoManager":null,"empty":false,"names":["style","category"]},
...
]
但是当我将查询移植到java中时,我得到了非常奇特的结果。(是的,我知道我在错误的位置打开/关闭连接,只是为了快速探索Couchbase语法/功能)

Java代码:

@RequestMapping("/hellocouchbase")
public ResponseEntity<List<JsonObject>> metrics() {

    Cluster cluster = CouchbaseCluster.create();
    cluster.authenticate(username, passwd);

    Bucket bucket = cluster.openBucket("beer-sample");

    N1qlQueryResult result = bucket.query(N1qlQuery.simple("select category, style from `beer-sample` where style like 'Imperial%'"));

    List<N1qlQueryRow> results = result.allRows();      
    List<JsonObject> answer = new ArrayList<>(results.size());

    for(N1qlQueryRow row:results) {
        answer.add(row.value());
    }

    cluster.disconnect();       
    return ResponseEntity.status(200).body(answer);
}

有人能解释一下如何使java查询产生与直接查询相同的结果吗?

尝试创建一个新用户并向其添加所有权限(只是为了确保您没有遇到任何安全限制)

您的代码适用于我:

    Cluster cluster = CouchbaseCluster.create();
    cluster.authenticate("test", "couchbase"); //user and password that I created

    Bucket bucket = cluster.openBucket("beer-sample");

    N1qlQueryResult result = bucket.query(N1qlQuery.simple("select category, style from `beer-sample` where style like 'Imperial%'"));

    List<N1qlQueryRow> results = result.allRows();
    List<JsonObject> answer = new ArrayList<>(results.size());

    for(N1qlQueryRow row:results) {
        answer.add(row.value());
        System.out.println(row);
    }

    cluster.disconnect();

出于某种原因,改变这一点

answer.add(row.value());
对此

answer.add(row.value().toMap());
帮我修好了。不知道为什么,考虑到原始版本显然对这里的其他人适用

完整的解决方案供参考:

@RequestMapping("/hellocouchbase")
public ResponseEntity<List<Map<String,Object>>> metrics() {

    Cluster cluster = CouchbaseCluster.create();
    cluster.authenticate(username, passwd);

    Bucket bucket = cluster.openBucket("beer-sample");

    N1qlQueryResult result = bucket.query(N1qlQuery.simple("select category, style from `beer-sample` where style like 'Imperial%'"));

    List<N1qlQueryRow> results = result.allRows();      
    List<Map<String,Object>> answer = new ArrayList<>(results.size());

    for(N1qlQueryRow row:results) {
        answer.add(row.value().toMap());
    }

    cluster.disconnect();       
    return ResponseEntity.status(200).body(answer);
}
@RequestMapping(“/hellocuchbase”)
公共响应度指标(){
Cluster Cluster=CouchbaseCluster.create();
cluster.authenticate(用户名、密码);
Bucket=cluster.openBucket(“啤酒样本”);
N1qlQueryResult结果=bucket.query(N1qlQuery.simple(“从'beer sample'中选择类别、样式,其中样式类似于'Imperial%'));
列表结果=result.allRows();
List answer=newarraylist(results.size());
对于(N1qlQueryRow行:结果){
add(row.value().toMap());
}
cluster.disconnect();
返回应答。状态(200)。主体(应答);
}
@RequestMapping("/hellocouchbase")
public ResponseEntity<List<Map<String,Object>>> metrics() {

    Cluster cluster = CouchbaseCluster.create();
    cluster.authenticate(username, passwd);

    Bucket bucket = cluster.openBucket("beer-sample");

    N1qlQueryResult result = bucket.query(N1qlQuery.simple("select category, style from `beer-sample` where style like 'Imperial%'"));

    List<N1qlQueryRow> results = result.allRows();      
    List<Map<String,Object>> answer = new ArrayList<>(results.size());

    for(N1qlQueryRow row:results) {
        answer.add(row.value().toMap());
    }

    cluster.disconnect();       
    return ResponseEntity.status(200).body(answer);
}