Working with N1QL
Explains how to Query a bucket using the N1QL query language.
You need to make sure to have the query engine downloaded, started and pointed to your cluster. Fore more information, visit http://query.couchbase.com.
Next, you need to enable it either through a system property or through the environment builder. This step will go away once N1QL is fully integrated into the server:
// Through a system property
System.setProperty("com.couchbase.queryEnabled", "true");
Cluster cluster = CouchbaseCluster.create();
Bucket bucket = cluster.openBucket("beer-sample").toBlocking().single();
// Through the builder
Cluster cluster = CouchbaseCluster.create(DefaultCouchbaseEnvironment
.builder()
.queryEnabled(true)
.build());
Bucket bucket = cluster.openBucket("beer-sample").toBlocking().single();
Finally, you can run a query using either raw N1QL strings or a DSL API:
// raw string query
Observable<QueryResult> query = bucket.query("SELECT * FROM beer-sample LIMIT 10");
// using the DSL
Observable<QueryResult> query = bucket.query(select("*").from("beer-sample").limit(10));
The select() method is a static import which kicks off a BNF (syntax) aware DSL for N1QL. It provides a typesafe and intuitive way to perform queries.
The query always returns a QueryResult, which aside from the actual QueryRows also contains debug or error information if supplied.
- rows: Contains all rows returned by the query, can be an empty Observable.
- info: Contains info-level JSON output from the server to debug the query (if success).
- success: shorthand identifier to see if the query was a success.
- error: If the query was not successful, contains a JsonObject identifying the error.
The following code prints the found documents and an error if it failed:
bucket
.query(select("*").from("beer-sample").limit(10))
.doOnNext(result -> {
if (!result.success()) {
System.err.println(result.error());
}
})
.flatMap(QueryResult::rows)
.toBlocking()
.forEach(row -> System.out.println(row.value()));