couchbase_Couchbase 2.0归类视图简介

couchbase

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

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

例如,创建如下所示的应用程序视图是必需的:

借助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]仅查看数据-部门和雇员-部门20-研究。

啤酒样品申请

您可以为啤酒样品应用程序创建一个等效视图,在同一视图中打印所有啤酒厂和啤酒。 在设计文档“酿酒厂”中,该视图称为“ 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

couchbase

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

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

相关文章

NOIP模拟测试20「周·任·飞」

liu_runda出的题再次$\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%\%$ 任 题解 题目中为什么反复强调简单路径,没有环 没有环的图中点数-边数联通块数 前缀和维护边的前缀和,和点的前缀和, 在维护边的前缀和不好维护转化为横着边前缀和,竖着边前缀和 注意边的边界问题 看边如何维护 就拿…

如何脚踏实地构建Java Agent

在构建Plumbr的多年中&#xff0c;我们遇到了许多具有挑战性的问题。 在其他方面&#xff0c;使Plumbr Java Agent可靠地执行而又不危害客户的应用程序&#xff0c;是一个特别棘手的任务。 从实时系统中安全地收集所有需要的遥测会带来很多问题。 其中一些非常简单&#xff0c;…

ASP.NET Core MVC 之依赖注入 Controller

ASP.NET Core MVC 控制器应通过构造函数明确地请求它们地依赖关系&#xff0c;在某些情况下&#xff0c;单个控制器地操作可能需要一个服务&#xff0c;在控制器级别上的请求可能没有意义。在这种情况下&#xff0c;也可以将服务作为 Action 的参数。 依赖注入是一种如 Depend…

16g内存 32g内存游戏区别_电脑内存8G和16G的差别大吗?打游戏需要多大内存?

Hello大家好&#xff0c;我是兼容机之家的小牛。电脑内存是除了CPU之外最重要的元件之一&#xff0c;电脑内存的多少直接影响着运行大型软件、多任务时电脑的流畅程度&#xff0c;很多玩家在第一次购买电脑的时候并不知道应该购买内存多大的电脑&#xff0c;今天小牛就来和大家…

用友U9执行JS代码。

UFSoft.UBF.UI.AtlasHelper.RegisterAtlasStartupScript(part.Page, part.Page.GetType(), "JavaScriptExecQueue", "alert(地球即将毁灭&#xff0c;进入倒计时&#xff1a;5&#xff0c;4&#xff0c;3&#xff0c;2&#xff0c;1…嘣&#xff01;嘣&#xff…

java培训学费_北京Java培训班学费很贵吗,包含了哪些收费项目

北京的Java培训班有很多&#xff0c;价格却是相差不多的&#xff0c;但培训的课程就参差不齐了&#xff0c;有的培训班就是为了赚钱而存在的&#xff0c;想要系统的学习Java&#xff0c;确保学习效果&#xff0c;那么你一定要挑选正规的Java培训班&#xff0c;挑选适合自己的Ja…

typora.io使用教程

引言&#xff1a;对于开发人员大部分都接触过.md文件&#xff0c;而typora.io就是专门编辑.md文件的工具&#xff0c;该工具对于编写接口文档特别方便&#xff0c;它提供了word类似的大纲视图&#xff0c;同时也提供了很多的功能&#xff0c;但是改软件本身却非常的小&#xff…

c#编译时提高兼容性_幻像类型提高了编译时的安全性

c#编译时提高兼容性介绍 使用幻像类型是一种非常简单的技术&#xff0c;可用于提高代码的编译时安全性。 有很多潜在的用例&#xff0c;其复杂性程度各不相同&#xff0c;但是即使幻像类型的轻量级使用也可以显着提高编译时的安全性。 幻像类型只是带有未使用类型参数的参数化类…

如何查看电脑显卡配置_3080显卡电脑配置清单(3700X/10700)

3080显卡昨天就解禁评测了&#xff0c;因为最近的老铁都很期待装3080的机器&#xff0c;我这边做了一些整理&#xff0c;方便各位老铁3080配置有综合的了解。3080显卡售价更加详尽的3080厂家整理可以参考&#xff1a;3080公版哪里买&#xff1f;&#xff08;所有厂家整理&#…

问题 1074: 数字整除

题目描述定理&#xff1a;把一个至少两位的正整数的个位数字去掉&#xff0c;再从余下的数中减去个位数的5倍。当且仅当差是17的倍数时&#xff0c;原数也是17的倍数 。 例如&#xff0c;34是17的倍数&#xff0c;因为3-20-17是17的倍数&#xff1b;201不是17的倍数&#xff0c…

GWT HTTP请求替代

由于多种原因 &#xff0c;许多GWT用户放弃了RPC机制&#xff0c;这是GWT提供的调用后端的标准方法。 他们发现&#xff0c;在GWT RequestBuilder与其他可能不适合其应用程序模型的外部库之间迷失了许多 。 这篇文章的目的是通过GWT中众所周知的HTTP / Rest库&#xff0c;以使情…

极限中0除以常数_基本不等式中常用公式百度作业帮

1. 基本不等式中常用公式基本不等式中常用公式&#xff1a;(1)√((ab)/2)≥(ab)/2≥√ab≥2/(1/a1/b)。(当且仅当ab时&#xff0c;等号成立)(2)√(ab)≤(ab)/2。(当且仅当ab时&#xff0c;等号成立)(3)ab≥2ab。(当且仅当ab时&#xff0c;等号成立)(4)ab≤(ab)/4。(当且仅当ab时…

NOIP模拟测试24「star way to hevaen·lost my music」

star way to heaven 题解 大致尝试了一下并查集,记忆化搜索,最小生成树 最小生成树是正解,跑最小生成树然后找到最大的值 欧几里德距离最小生成树学习 prim楞跑 至于为什么跑最小生成树不是跑最大生成树,你跑最大生成树连的边可能会^%$&$%!# 感性理解手膜吧,我理解但说不清…

NOIP模拟测试25「字符串·乌鸦喝水·所陀门王的宝藏(陀螺王)」

字符串 题解 没看出catalan怎么办 dp打表啊! 考虑大力dp拿到30分好成绩!顺便收获一张表 打表发现$C_{nm}^{m}-C_{nm}^{m-1}$ 仔细观察然后发现其实就是之前的网格那个题 那么我们回顾一下网格那个题 先看最简单的nm情况 求左下角走到右上角方案数,不能经过中间那条线 考虑大力容…

stackexchange_通过Spring Social推特StackExchange –第1部分

stackexchange本文将介绍一个快速的附带项目-一个自动从各种Q&#xff06;A StackExchange网站上发布热门问题的机器人&#xff0c;例如StackOverflow &#xff0c; ServerFault &#xff0c; SuperUser等。我们将为StackExchange API构建一个简单的客户端&#xff0c;然后进行…

bandizip最后一个无广告版本_【软件来了】这是个无广告的旧版知乎

近两天有新加入粉丝团队的小伙伴在询问G先生旧版App的事情&#xff0c;文章已发过很久&#xff0c;但是知乎的旧版本还是头一次分享给大家&#xff0c;所以G先生就找到了两个版本的旧版知乎&#xff0c;知乎V3.1和知乎V3.9这两个知乎都支持在最高的系统&#xff0c;没有广告也没…

NOIP模拟测试26「嚎叫响彻在贪婪的机房·主仆见证了 Hobo 的离别·征途堆积出友情的永恒」...

题目比较神仙&#xff0c;注意是题目神仙 贪婪暗示贪心&#xff0c;堆积暗示堆优化$\%\%\%\%\%\%\%$ 两个乱搞$$一个堆优化$dp$ 嚎叫响彻在贪婪的机房 题解 对于一个序列来说只要他们差的$gcd$不为$1$就可以构成等差数列 例如 $2$ $4$ $16$ $2$与$4$差$2$ $4$与$16$差$1…

渴望订阅– RxJava常见问题解答

在教学和指导RxJava以及撰写本书之后 &#xff0c;我注意到某些领域尤其成问题。 我决定发布一些简短的提示&#xff0c;以解决最常见的陷阱。 这是第一部分。 Observable和Flowable本质上是惰性的。 这意味着无论您在Flowable放置了多么繁琐或长时间运行的逻辑&#xff0c;仅…

WPScan高级用法和定制

自定义扫描选项 WordPress作为一个广泛使用的内容管理系统&#xff08;CMS&#xff09;&#xff0c;为用户提供了丰富的自定义选项&#xff0c;使其能够根据特定需求创建个性化的网站。其中一个重要的自定义选项是自定义扫描选项&#xff0c;它允许用户对WordPress网站进行深度…