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

couchbase_Couchbase 2.0归类视图简介相关推荐

  1. Couchbase 2.0归类视图简介

    大多数应用程序必须处理"主/详细"类型的数据: 啤酒厂和啤酒 部门和员工 发票和项目 - 例如,这对于创建如下应用程序视图是必需的: 借助Couchbase和许多面向文档的数据库, ...

  2. 《Adobe Illustrator CC经典教程》—第0课0.1节简介

    本节书摘来自异步社区<Adobe Illustrator CC经典教程>一书中的第0课0.1节简介,作者[美]Adobe公司,更多章节内容可以访问云栖社区"异步社区"公 ...

  3. mysql 视图 教程_MySQL视图简介及基本操作教程

    前言 视图是数据库系统中一种非常有用的数据库对象.MySQL 5.0 之后的版本添加了对视图的支持. 认识视图 视图是一个虚拟表,其内容由查询定义.同真实表一样,视图包含一系列带有名称的列和行数据,但 ...

  4. 模型视图简介、QListWidget、QTreeWidget、QTableWidget、QStringListModel、QFileSystemModel

    一.模型视图简介 有时,我们的系统需要显示大量数据,比如从数据库中读取数据,以自己的方式显示在自己的应用程序的界面中.早期的 Qt 要实现这个功能,需要定义一个组件,在这个组件中保存一个数据对象,比如 ...

  5. couchdb 视图操作_CouchDB 视图简介及增量更新视图的方法

    CouchDB 视图简介及增量更新视图的方法 郭 君, 高 云鹤, 和 林 宜谦 2016 年 4 月 18 日发布 简介 CouchDB 是一种 NoSQL 数据库,数据以 JSON 文档的形式存储 ...

  6. Enterprise Library 5.0 开发向导- 简介(1)

    Enterprise Library 5.0 开发向导- 简介(1) 微软企业库 Enterprise Library 5.0 正式发布!!! 在基于微软.NET 框架开发的应用程序中,无论是企业级的 ...

  7. Maven 学习 (0) Maven 简介

    2019独角兽企业重金招聘Python工程师标准>>> Maven 学习 (0) Maven 简介 什么是 Maven? Apache Maven 是一个软件项目的管理和理解工具.M ...

  8. android studio viewo,android studio 3.6.0 绑定视图新特性的方法

    Android studio 3.6.0 绑定视图使用方法 1.确保你的 build gradle 最低为3.6.0 dependencies { classpath 'com.android.too ...

  9. 无人机飞控 ardupilot Copter-4.0.7 库简介

    无人机飞控 ardupilot Copter-4.0.7 库简介 官方文档-库说明 核心库: 库名称 作用 AP_AHRS 使用 DCM 或 EKF 进行姿态估计 AP_Common 所有草图和库所需 ...

最新文章

  1. python如何跨模块调用变量_Python跨模块用户定义的全局变量:在其他模块运行时调用它们的问题...
  2. java怎么将前端的数据存到关联的表中_MySQL数据库性能优化
  3. 第十五届全国大学生智能车竞赛 室外光电组线上选拔赛比赛流程
  4. UIProgressView的使用
  5. AngularJS 无限滚动加载数据控件 ngInfiniteScroll
  6. 图解Go语言内存分配
  7. CSS Framework 960 Grid System (收)
  8. 检测php加密方式,一种php加密方式
  9. linux中不同版本的gcc切换,Ubuntu 14.04中升级gcc到版本4.9.2并切换使用它们
  10. 暗棋单机版_中国暗棋游戏下载-中国暗棋下载v1.0.0 安卓版-单机手游网
  11. darknet + yolo3 训练自己的数据集
  12. Android Studio连接MuMu模拟器
  13. Android 强制指定录音声卡
  14. Ardunio开发实例-TSL2591数字环境光传感器
  15. 初识Postman工具
  16. mysql binlog grep_通过mysqlbinlog和grep命令定位binlog文件中指定操作
  17. moviepy音视频开发:音频合成类AudioArrayClip介绍
  18. Android开源 -- 开源的基于 Material Design设计的豆瓣的Android客户端“豆芽”
  19. html5 监控系统界面,基于WEB服务器实现监控系统的视频图像显示
  20. 优酷K1 YK-K1 开机主动访问的域名

热门文章

  1. 腾讯面试题:一条SQL语句执行得很慢的原因有哪些?
  2. jdk1.8.0_45源码解读——ArrayList的实现
  3. 漫画:什么是volatile关键字?(整合版)
  4. 漫画:什么是动态规划?(整合版)
  5. springboot项目不加端口号也可以访问项目的方法
  6. 2016蓝桥杯省赛---java---B---7(剪邮票)
  7. android volley 上传图片 和参数,Android使用Volley实现上传文件功能
  8. 充电提示音_iPhone如何自定义充电提示音,图文教程
  9. Restlet Client 安装 网盘里面有压缩文件夹下载引用即可 谷歌浏览器
  10. redis集群信息分析-cluster info-cluster nodes