使用Couchbase 2.0开发新应用程序时,有时需要从代码中动态创建视图。 例如,在安装应用程序,编写一些测试时,可能会需要此方法;或者,在构建框架时,您也可以使用它,并希望动态创建视图以查询数据。 这篇文章展示了如何做到这一点。
先决条件
如果使用的是Maven,则可以在pom.xml中使用以下信息来添加Java客户端库:
<repositories>
<repository>
<id>couchbase</id>
<name>Couchbase Maven Repository</name>
<layout>default</layout>
<url>http://files.couchbase.com/maven2/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<dependencies>
<dependency>
<groupid>couchbase</groupid>
<artifactid>couchbase-client</artifactid>
<version>1.1.0</version>
<type>jar</type>
</dependency>
</dependencies>
在线查看https://gist.github.com/4337172
从Java创建和管理视图
完整的Maven项目可在Github上获得 。
连接到Couchbase群集
当您想从Java创建视图时,要做的第一件事显然是连接到集群。
import com.couchbase.client.CouchbaseClient;
...
...
List<uri> uris = new LinkedList<uri>();
uris.add(URI.create("http://127.0.0.1:8091/pools"));
CouchbaseClient client = null;
try {
client = new CouchbaseClient(uris, "beer-sample", "");
// put your code here
client.shutdown();
} catch (Exception e) {
System.err.println("Error connecting to Couchbase: " + e.getMessage());
System.exit(0);
}
...
...
</uri></uri>
- 创建到群集不同节点的URI列表-第5-6行。 (在此示例中,我正在单个节点上工作)
- 连接到存储桶,在本例中为Beer-sample -line9。如果存储桶受保护,则可以包括密码(在这种情况下不是这样,因此我将发送一个空字符串)
如果您正在寻找有关Couchbase和Java的更多信息,可以从DZone阅读这篇文章: Hello World with Couchbase和Java 。
现在让我们谈谈Couchbase视图。 您可以使用views / map-reduce函数基于存储在Couchbase中的JSON文档的内容来索引和查询Couchbase Server中的数据。 有关视图的更多信息,请参见《 Couchbase服务器手册》的“视图基础”一章 。
从Java创建视图
从Java创建视图确实很容易:Java客户端库包含完成该操作的所有类和方法。 作为一个具体的用例,我们将使用Couchbase Java教程中描述的应用程序。
遵循本教程时,您需要手动创建一些视图,如此处所示 。 在此示例中,我们将直接在Java代码中创建映射函数,然后将其存储到Couchbase Server。 本教程要求您创建以下工件:
- 一个名为“ by_name”的视图
- 在名为“ dev_beer”的设计文档中(开发模式)
- 和map函数,如下所示:
function (doc, meta) {
if(doc.type && doc.type == 'beer') {
emit(doc.name, null);
}
}
以下代码允许您从Java进行操作:
import com.couchbase.client.protocol.views.DesignDocument;
import com.couchbase.client.protocol.views.ViewDesign;
...
DesignDocument designDoc = new DesignDocument('dev_beer');
String viewName = 'by_name';
String mapFunction =
'function (doc, meta) {\n' +
' if(doc.type && doc.type == \'beer\') {\n' +
' emit(doc.name);\n' +
' }\n' +
'}';
ViewDesign viewDesign = new ViewDesign(viewName,mapFunction);
designDoc.getViews().add(viewDesign);
client.createDesignDoc( designDoc );
...
- 使用com.couchbase.client.protocol.views.DesignDocument类-第4行创建设计文档。
- 使用com.couchbase.client.protocol.views.ViewDesign类创建一个具有名称和地图功能的视图-第14行。
- 您可以将此视图添加到设计文档中-第15行
- 最后,使用CouchbaseClient.createDesignDoc方法将文档保存到集群中。
如果需要使用reduce函数(内置或自定义),则只需将其作为第三个参数传递给ViewDesign构造函数。
从Java或任何其他工具/语言开发视图时,请确保您了解什么是最佳实践以及索引的生命周期。 这就是为什么我邀请您阅读Couchbase文档中的以下章节:
- View Writing Best Practice :例如在map函数中,我没有发出任何值。 我只发出一个密钥(啤酒名称)。
- 视图和存储的数据
- 开发和生产视图 :在上面的视图中,我已经在开发环境(dev_前缀)中创建了视图,使我可以在数据的子集(集群/索引)中对其进行测试和使用
使用视图
首先,您刚刚创建的视图处于“开发模式”,默认情况下,Java客户端SDK仅在处于“生产模式”时访问该视图。 这意味着当您从应用程序调用视图时,它将在生产环境中搜索它。 因此,在连接到Couchbase集群之前,您需要设置视图模式以进行开发。
这是使用Java SDK中的viewmode环境变量完成的,可以使用以下方法进行设置:
- 在您的代码中,在客户端连接到集群之前添加以下行:System.setProperty('viewmode','development');
- 在命令行-Dviewmode = development
- 在属性文件中viewmode = development
完成后,您可以使用以下代码调用视图:
import import com.couchbase.client.protocol.views.*;
...
System.setProperty('viewmode', 'development'); // before the connection to Couchbase
...
View view = client.getView('beer', 'by_name');
Query query = new Query();
query.setIncludeDocs(true).setLimit(20);
query.setStale( Stale.FALSE );
ViewResponse result = client.query(view, query);
for(ViewRow row : result) {
row.getDocument(); // deal with the document/data
}
...
这段代码查询您刚刚创建的视图。 这意味着Couchbase Server将基于您的map函数生成索引,并向服务器查询结果。 在这种情况下,我们特别希望设置限制为20个结果,并且还可以通过设置Stale.FALSE获得最新的结果。
- 将viewmode设置为development –第4行
- 使用CouchbaseClient.getView()方法第6行获取视图。 如您所见,我只是在设计文档中使用啤酒名称(而不是dev_beer,因为我处于开发模式,所以Couchbase会知道在哪里搜索)
- 创建一个查询并设置一个限制(20),然后要求SDK返回文档本身
setIncludeDocs(true)-行8-将以最有效的方式从Couchbase服务器返回文档 - 在使用query.setStale(Stale.FALSE)返回结果之前,要求系统更新索引。 线9-。 再次使用setStale方法时要小心。 只是为了确保这里是有关它的文档: 索引更新和过时的参数
- 执行查询–第10行
- 并使用结果–第11-13行
结论
在本文中,您了解了:
- 如何从Java创建Couchbase视图
- 从Java调用此视图
- 从Couchbase Java客户端库配置开发/生产模式视图
本示例仅限于视图的创建,如果要管理设计文档,可以查看与设计文档和视图相关的其他方法:getDesignDocument(),deleteDesignDocument()等。
参考: Couchbase 101:在Tug的Blog博客上,从我们的JCG合作伙伴 Tugdual Grall在Java应用程序中创建视图(MapReduce) 。