Couchbase 2.0归类视图简介

大多数应用程序必须处理“主/详细”类型的数据:

  • 啤酒厂和啤酒
  • 部门和员工
  • 发票和项目

例如,这对于创建如下应用程序视图是必需的:

借助Couchbase和许多面向文档的数据库,您可以采用不同的方式来处理此问题,您可以:

  • 为每个母版创建一个文档,并将所有子级嵌入其中
  • 创建一个主文档和子文档,并使用属性链接它们。

在第一种情况下,所有信息都存储在一个文档中,使用整个数据集非常容易,例如,创建一个显示所有信息的屏幕,但是第二种情况呢? 在这篇文章中,我将解释如何使用Couchbase视图来处理该问题,并使其易于创建主视图/详细视图。 作为前Oracle员工,我将使用臭名昭著的SCOTT模式以及DEPT和EMP表,作为第一个示例。 然后最后,我将其扩展到Couchbase随附的啤酒样本数据。

数据

Couchbase是一个无模式的数据库,您可以在其中存储“任何内容”,但是为此,您需要使用JSON文档并创建两种类型的文档:“部门”和“员工”。 我们通常这样做的方法是使用技术属性来键入文档。 因此,员工和部门文档如下所示:

{'type': 'dept','id': 10,'name': 'Accounting','city': 'New York'
}

雇员

{'type': 'emp','id': 7782,'name': 'Blake','job': 'Clark','manager': 7839,'salary': 2450,'dept_id': 'dept__10'
}

这仅显示文档,在Couchbase中,您必须将文档与键关联。 对于这个例子,我使用一个简单的模式:
type__id,对于这些文档,键如下所示:

  • 部__10
  • emp__20

您可以使用任何模式来创建密钥,例如,可以为您选择放置电子邮件的员工创建密钥。 请注意员工文档中的“ dept_id”属性。 这是部门的关键; 您可以将其视为“外键”。 但是请记住,部门文档和员工文档之间的关系完全由应用程序管理,Couchbase Server不会强制执行它。 我创建了一个包含所有数据的Zip文件,您可以从此处下载该文件; 并使用cbdocloader实用程序将数据导入Couchbase。 要导入数据,请从终端窗口运行以下命令:

./cbdocloader -n 127.0.0.1:8091 -u Administrator -p password -b default ~/Downloads/emp-dept.zip

您可以在文档中了解有关cbdocloader工具的更多信息。

风景

Couchbase中的查询基于视图 ; 和视图建立索引,因此我们必须创建一个视图,准确地说是一个“整理视图”。 整理视图的想法是产生索引,在索引中对键进行排序,以便首先显示父ID,然后是其子ID。 因此,我们正在生成一个如下所示的索引:

DEPT_10,会计
DEPT_10,布莱克
米勒DEPT_10 DEPT_20,研究中 DEPT_20,亚当斯 福特DEPT_20 …

实际上,使用Couchbase视图非常容易。 这里唯一的技巧是控制顺序,并确保主控始终是第一个,紧接其子级。 因此,为了控制它,我们可以创建一个包含部门ID,“排序”元素和名称(啤酒或啤酒厂)的复合键。 因此,视图的地图功能如下所示:

function (doc, meta) {if (doc.type == "emp" || doc.type == "dept") {switch(doc.type) {case "dept" :emit( [meta.id, 0, doc.name], 0 );break;case "emp" :emit( [doc.dept_id, 1, doc.name ], doc.salary + ((doc.comm)?doc.comm:0) );break;}}
}

密钥包括:

  • 根据文档类型从部门文档本身或从员工文档中提取的部门ID
  • 用于控制排序的任意数字。 我为部门放0,为员工放1
  • 部门或雇员的名称,这也允许按名称对结果进行排序

除密钥外,此视图还用于发出有关员工薪水的一些信息。 工资只是工资加上佣金(如果存在)的总和。 视图的结果如下所示:

通过此视图,您现在可以使用视图结果为您的应用程序生成报告。 也可以在查询中使用参数仅查看部分数据,例如按部门查看,例如使用startkey = ['dept__20',0]&endkey = ['dept__20',2]仅查看数据-研究部的部门和雇员-。

啤酒样品申请

您可以为啤酒样品应用程序创建一个等效视图,在同一视图中打印所有啤酒厂和啤酒。 在设计文档“酿酒厂”中,该视图称为“ all_with_beers”。 该视图如下所示:

function(doc, meta) {switch(doc.type) {case "brewery":emit([meta.id, 0, doc.name]);break;case "beer":if (doc.name && doc.brewery_id) {emit([doc.brewery_id, 1, doc.name], null);}}                    
}

一旦将其发布到生产环境中,就可以在Beer Sample应用程序中使用它,对于本示例,我已经修改了Java示例应用程序。

创建一个servlet来处理用户请求并在/ all URI上。

使用以下代码调用视图的“ BreweryAndBeerServlet”:

View view = client.getView("brewery", "all_with_beers");Query query = new Query();query.setIncludeDocs(true).setLimit(100);ViewResponse result = client.query(view, query);ArrayList<HashMap<String, String>> items =new ArrayList<HashMap<String, String>>();for(ViewRow row : result) {HashMap<String, String> parsedDoc = gson.fromJson((String)row.getDocument(), HashMap.class);HashMap<String, String> item = new HashMap<String, String>();item.put("id", row.getId());item.put("name", parsedDoc.get("name"));item.put("type", parsedDoc.get("type"));items.add(item);}request.setAttribute("items", items);request.getRequestDispatcher("/WEB-INF/breweries/all.jsp").forward(request, response);

查询结果设置到HttpRequest中,并执行all.jsp页面。 JSP使用JSTL通过以下代码来打印信息:

<table id="brewery-table" class="table table-striped"><thead><tr><th>Name</th><th></th><th></th></tr></thead><tbody><c:forEach items="${items}" var="item"><c:if test="${ item.type == 'brewery' }"><tr><td colspan="2"><strong><a href="/breweries/show/${item.id}">${item.name}</a></strong></td><td><a class="btn btn-small btn-danger" href="/breweries/delete/${item.id}">Delete</a></td></tr></c:if><c:if test="${ item.type == 'beer' }"><tr><td></td><td><a href="/beers/show/${item.id}">${item.name}</a></td><td><a class="btn btn-small btn-danger" href="/beers/delete/${item.id}">Delete</a><a class="btn btn-small btn-warning" href="/beers/edit/${item.id}">Edit</a></td></tr></c:if></c:forEach></tbody></table>

JSP从HTTP请求中获取项目并在每个项目上循环,然后根据项目的类型打印信息。 最终结果如下:

此处提供了Beer Sample应用程序的扩展: https : //github.com/tgrall/beersample-java/tree/BreweriesAndBeers

参考:来自Tug博客博客的JCG合作伙伴 Tugdual Grall 介绍了使用Couchbase 2.0的整理视图 。

翻译自: https://www.javacodegeeks.com/2013/02/introduction-to-collated-views-with-couchbase-2-0.html

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

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

相关文章

(转)利用WPF的ListView进行大数据量异步加载

原文&#xff1a;http://www.cnblogs.com/scy251147/archive/2012/01/08/2305319.html 由于之前利用Winform的ListView进行大数据量加载的时候&#xff0c;诟病良多&#xff0c;所以今天试着用WPF的ListView来做了一下&#xff0c;结果没有让我失望&#xff0c;我将一个拥有430…

有关循环和判断的几个小问题

注意在while嵌套的if语句之外&#xff0c;还有一个cin>>n;因为刚刚没有这一部分的时候&#xff0c;执行的结果是这样的&#xff1a; 把while里面的cin>>n;注释掉了之后&#xff0c;在cmd里执行的时候&#xff0c;只能输入数字&#xff0c;但是没有任何的反应。 但其…

PHP7 学习笔记(五)安装event扩展(libevent)

一、描述&#xff1a;有效安排I/O&#xff0c;时间和信号的扩展 使用可用于特定平台的最佳I/O通知机制的事件,是PHP基础设施的libevent端口。 二、下载地址&#xff1a;http://pecl.php.net/package/event 三、安装支持库libevent&#xff0c;需要编译高版本&#xff08;这里以…

有关输出图形的代码,我觉得好难啊,好蒙啊。

这里的代码其实没看懂过&#xff0c;自己看到书上这一题的时候也是挺蒙的&#xff0c;压根不知道要怎么下手&#xff0c;照着书上把代码打进去之后也不清楚原理&#xff0c;可怕的是&#xff0c;反反复复对着答案敲了几遍代码&#xff0c;执行结果还是这样的&#xff0c;和课本…

Windows环境变量的应用

设置环境变量快速打开程序 如果你对桌面上密密麻麻的文件感到烦恼&#xff0c;那么下面的方法可以帮到你。 Step 1 在硬盘的某个位置添加一个文件夹&#xff0c;把你经常用的程序的快捷方式放进这个文件夹&#xff0c;快捷方式重命名最好简单易记&#xff0c;如图 注意 快捷方式…

mysql 备份数据库_mysql数据库备份

前一段时间因为误操作删除了一张表的几条数据&#xff0c;弄得很尴尬&#xff0c;正好这周有空就折腾了下数据备份的知识&#xff0c;现把mysql的数据备份相关实践和心得总结如下&#xff1a;一.使用mysqldump命令备份数据库&#xff1a;备份整个数据库(包括表结构和数据),用法…

JavaScript:Browser 对象

ylbtech-JavaScript&#xff1a;Browser 对象1. Window 对象返回顶部 1、Window 对象 Window 对象 Window 对象表示浏览器中打开的窗口。 如果文档包含框架&#xff08;<frame> 或 <iframe> 标签&#xff09;&#xff0c;浏览器会为 HTML 文档创建一个 window 对象…

深入理解line-height与vertical-align——前端布局常用属性

line-height、font-size、vertical-align是设置行内元素布局的关键属性。这三个属性是相互依赖的关系&#xff0c;改变行间距离、设置垂直对齐等都需要它们的通力合作。下面将主要介绍line-height与vertical-align&#xff1a; 行高 【定义】 line-height行高是指文本行基线之…

UWP开发入门(四)——自定义CommandBar

UWP开发入门&#xff08;四&#xff09;——自定义CommandBar 原文:UWP开发入门&#xff08;四&#xff09;——自定义CommandBar各位好&#xff0c;再次回到UWP开发入门系列&#xff0c;刚回归可能有些不适应&#xff0c;所以今天我们讲个简单的&#xff0c;自定义CommandBar&…

(转)Cobbler无人值守批量安装Linux系统

本文目录&#xff1a; 1.1 pxe安装系统 1.2 cobbler基本介绍 1.3 安装和配置cobbler 1.3.1 安装cobbler 1.3.2 配置dhcp和tftp 1.4 cobbler从本地光盘安装系统 1.4.1 生成distro 1.4.2 提供kickstart文件 1.4.3 提供profile 1.4.4 开始安装 1.5 比pxekickstart好的地方 1.6 让新…

Spring集成–从头开始应用程序,第1部分

开始之前 在本教程中&#xff0c;您将学习什么是Spring Integration &#xff0c;如何使用它以及有助于解决哪些问题。 我们将从头开始构建一个示例应用程序&#xff0c;并演示Spring Integration的一些核心组件。 如果您不熟悉Spring&#xff0c;请查看我编写的另一本有关Spri…

初学者Web介绍一些前端开发中的基本概念用到的技术

Web开发是比较费神的&#xff0c;需要掌握很多很多的东西&#xff0c;特别是从事前端开发的朋友&#xff0c;需要通十行才行。今天&#xff0c;本文向初学者介绍一些Web开发中的基本概念和用到的技术&#xff0c;从A到Z总共26项&#xff0c;每项对应一个概念或者技术。 初学者W…

Xcode 快捷键及代码格式化

按住apple键点击类名就可以定位到这个类中查看相关定义&#xff08;在日后的开发中我们会经常这么来做&#xff0c;毕竟要记住iOS开发中所有的API是不现实的&#xff0c;有些API我们可以通过这种方法来查找&#xff09; PS&#xff1a;下面都是网上百度后经过我自己整理&#x…

主席树学习小结(POJ 2104)

在高中的时候就听到过主席树了&#xff0c;感觉非常高端&#xff0c;在寒假的时候 winter homework中有一题是查找区间第K大的树&#xff0c;当时就开始百度这种网上的博客&#xff0c;发现主席树看不懂&#xff0c;因为那个root[i]&#xff0c;还有tx[x].l与tx[x].r是什么意思…

下拉菜单

<!Doctype html> <html> <head> <meta charset"utf-8"> <title>下拉菜单</title> <style> *{ margin:0; padding:0; } ul{ list-style:none; overflow:hidden; background-color:#333; } li{ float:left; } li a,.drop…

deepin下Clion连接mysql_CLion如何添加依赖库 ? 需要把mysql/Connector c++放入 用cpp连接数据库...

目前我把下载的mysql/Connector 下载后放在了project内 但是报错信息如下报错信息如下In file included from /Users/wsgdrfz/study/c/Libary_System/librarySystem/sqlConnection.h:/Users/wsgdrfz/study/c/Libary_System/librarySystem/sqlFiles/include/mysql_connection.h7…

[开源JVM] yvm - 自制Java虚拟机

中文 | English | | | YVM是用C写的一个Java虚拟机&#xff0c;现在支持Java大部分功能&#xff0c;以及一个基于标记清除算法的并发垃圾回收器. 不过还有很多bug等待修复。 感兴趣的朋友pull request/fork/star吧。 Github repo https://github.com/racaljk/yvm 已支持语言…

printf函数输出超出int时怎么办

int、long、long long在printf中的格式 https://blog.csdn.net/fz_ywj/article/details/8107582 蓝桥杯 2796. BASIC-11 十六进制转十进制 从键盘输入一个不超过8位的正的十六进制数字符串&#xff0c;将它转换为正的十进制数后输出。   注&#xff1a;十六进制数中的10~15…

升级glibc的影响_Java 11 升级:“债务”“危机”

导读&#xff1a;AJDK11(阿里内部基于openJDK11的定制版本)在19年3月左右发布&#xff0c;到现在也快1年了&#xff0c;不过目前整体使用的面还是比较窄&#xff0c;特性被了解的也不是很多&#xff0c;Java11作为OpenJDK发布的LTS版本&#xff0c;对我们来说&#xff0c;还是需…

The processing instruction target matching [xX][mM][lL] is not allowed.

原因&#xff1a;xml标签 必须在第一行。 转载于:https://www.cnblogs.com/wangkang0320/p/7569100.html