Couchbase 101:从Java应用程序创建视图(MapReduce)

使用Couchbase 2.0开发新应用程序时,有时需要从代码中动态创建视图。 例如,在安装应用程序,编写一些测试时,可能会需要此方法;或者,在构建框架时,您也可以使用它,并希望动态创建视图以查询数据。 这篇文章展示了如何做到这一点。

先决条件

  • Couchbase服务器2.0
  • Couchbase Jave客户端库1.1.x
  • 啤酒样品数据集

如果使用的是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 hereclient.shutdown();      } catch (Exception e) {System.err.println("Error connecting to Couchbase: " + e.getMessage());System.exit(0);}...
...
</uri></uri>
  1. 创建到群集不同节点的URI列表-第5-6行。 (在此示例中,我正在单个节点上工作)
  2. 连接到存储桶,在本例中为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) 。

翻译自: https://www.javacodegeeks.com/2013/01/couchbase-101-create-views-mapreduce-from-your-java-application.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/369862.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

函数的参数详解

# 函数的参数定义函数的时候&#xff0c;我们把参数的名字和位置确定下来&#xff0c;函数的接口定义就算完成了。 对于函数的调用者来说&#xff0c;只需要知道如何传递正确的参数&#xff0c;以及函数将返回什么样的值就够了 函数内政部的复杂逻辑被封装起来&#xff0c;调用…

gRPC之grpcurl

1、grpcurl grpcurl项目地址 &#xff1a;https://github.com/fullstorydev/grpcurl 一般情况下测试 gRPC 服务&#xff0c;都是通过客户端来直接请求服务端。如果客户端还没准备好的话&#xff0c;也可以使用 BloomRPC (https://appimage.github.io/BloomRPC/)这样的 GUI 客…

算法初步——two pointers

什么是 two pointers   以一个例子引入&#xff1a;给定一个递增的正整数序列和一个正整数 M&#xff0c;求序列中的两个不同位置的数 a 和 b&#xff0c;使得它们的和恰好为 M&#xff0c;输出所有满足条件的方案。 本题的一个最直观的想法是&#xff0c;使用二重循环枚举序…

H5 _拖放使用

1 <!DOCTYPE html>2 <html lang"en">3 <head>4 <meta charset"UTF-8">5 <title>拖放API</title>6 <style>7 [iddragme]{8 width: 100px;9 height: 100px; 10 …

从XaaS到Java EE – 2012年哪一种该死的云最适合我?

您是否曾经想过要让Java EE在某个地方启动和运行需要什么&#xff1f; 是的 多年。 从托管我自己的主机开始&#xff0c;转到一些托管产品 &#xff0c;最后偶然发现了PaaS运动。 老实说&#xff0c;我并没有太认真。 我只是想把我的东西放到某个地方&#xff0c;而不在乎解决…

正方体最快最简单画_素描新手入门第一幅画可不只是“正方体”

很多素描教程都把正方体作为入门第一幅画学习内容。这种现象也成了约定俗成的规矩但是&#xff0c;学过画画的人大概都知道有很多人画了多年石膏几何形、静物、人头像甚至半身像全身像。到最后落得只会画这些学过的东西。这就说明学习出了问题。绘画练习一定要弄清楚每个物体练…

重写Alert和confirm方法去除地址显示

//重写alert方法&#xff0c;去掉地址显示window.alertfunction(name){var iframedocument.createElement("IFRAME");iframe.style.display"none";iframe.setAttribute("src",data:text/plain,); document.documentElement.appendChild(iframe);…

VS2015配置内核WDK7600环境,32位下.

VS2015配置内核WDK7600环境,32位下. 学习内核驱动的编写,就要会配置环境.不然总是用记事本编写.比较不方便. 环境配置如下. 1.首先下载WDK7600, 课堂资料代码中已经上传.链接&#xff1a;https://pan.baidu.com/s/1o9PjpUU 密码&#xff1a;k5sp 2.VS2015下载. 这个网络上有很多…

Camel 2.11 –具有URL重写功能的HTTP代理路由

在即将发布的Apache Camel 2.11版本中&#xff0c;我最近添加了对将自定义url重写实现插入基于HTTP的路由&#xff08;http&#xff0c;http4&#xff0c;jetty&#xff09;的支持。 当您使用骆驼代理/桥接HTTP路由时&#xff0c;这使人们可以控制url映射。 例如&#xff0c;假…

我的改进版2048(1)

&#xff08;假设有谁想要这个软件的话&#xff0c;在评论中留一个邮箱吧。&#xff09; 前几天好几次看到有朋友晒出玩2048刷高分的截图。我就想我能不能也做一个2048呢&#xff1f;细致想了想2048游戏的规律&#xff0c;发现事实上逻辑上非常easy&#xff0c;也不用研究什么算…

什么是 HTML5?

HTML5 是下一代的 HTML。 什么是 HTML5&#xff1f; HTML5 将成为 HTML、XHTML 以及 HTML DOM 的新标准。 HTML 的上一个版本诞生于 1999 年。自从那以后&#xff0c;Web 世界已经经历了巨变。 HTML5 仍处于完善之中。然而&#xff0c;大部分现代浏览器已经具备了某些 HTML5 支…

涉及CDI和JSF的过期对话的定制错误页面

自上次写博客以来已经有一段时间了。 我一直在考虑写一些技术博客&#xff0c;但最终却忙于其他事情。 上周&#xff0c;在Coderanch论坛上进行了非常有趣的讨论。 甚至更有趣&#xff0c;因为它涉及JBoss。 熟悉Java EE Web应用程序的开发人员会知道&#xff0c;Web应用程序部…

2020年市场最缺什么_2020年聚合氯化铝市场评述

2020年聚合氯化铝市场评述一、行情概述&#xff1a;今年聚合氯化铝价格整体呈下滑趋势&#xff0c;接近年底价格才有小幅反弹。但不同时期价格有小幅起伏&#xff0c;主要受疫情影响&#xff0c;在下游需求不佳的影响下价格出现下滑。1月受疫情影响&#xff0c;前期停产企业短期…

通过反射来将一个类的内容转换到另外一个类里

主函数&#xff1a; import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.serializer.ValueFilter;import com.google.common.base.Preconditions; import java.lang.reflect.Field;import java.lang.reflect.Modifier; public class leijun {public static void ma…

sql语句中left join和inner join中的on与where的区别分析

sql语句中left join和inner join中的on与where的区别分析 原文:sql语句中left join和inner join中的on与where的区别分析关于SQL SERVER的表联接查询INNER JOIN 、LEFT JOIN和RIGHT JOIN&#xff0c;经常会用到ON和WHERE的条件查询&#xff0c;以前用的时候有时是凭感觉的&…

开发辅助 | 阿里图标库iconfont入门使用

目前大多数的互联网公司&#xff0c;前端开发和UI设计师配合中&#xff0c;针对设计师给图的效果图&#xff0c;前端开发工程师不再像往常一样对于细小图标进行切图&#xff0c;取而代之的是引用阿里图标库&#xff08;http://iconfont.cn/&#xff09;&#xff1b;简单的临时开…

使用Spring Security对RESTful服务进行身份验证

1.概述 本文重点介绍如何针对提供安全服务的安全REST API进行身份验证 -主要是RESTful用户帐户和身份验证服务。 2.目标 首先&#xff0c;让我们看一下参与者-典型的启用了Spring Security的应用程序需要针对某些事物进行身份验证-该事物可以是数据库&#xff0c;LDAP或可以是…

可拖动的弹窗

pc端&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>可拖动的弹窗</title> <style type"text/css"> a{text-decoration: …

向量外积_解析几何 -向量

目录1.向量2.内积3.外积4.混合积5.双重外积6.关系式正文1.向量vector 引入vector O规定O没有确切的方向&#xff0c;即与任何向量不仅平行&#xff0c;而且垂直。申明&#xff1a;本文章的向量为自由向量&#xff0c;即始点不固定的向量&#xff0c;它可以任意的平行移动&#…

HTML5 参数传递

页面显示效果&#xff0c;如下图&#xff1a; 主页面代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head><body><br><br><a href"jssendValue.html?i…