绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
couchbase_Couchbase 2.0归类视图简介
2022-04-11 15:10:07

couchbase

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

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

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

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

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

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

数据

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

部门

  1. {
  2. 'type': 'dept',
  3. 'id': 10,
  4. 'name': 'Accounting',
  5. 'city': 'New York'
  6. }

雇员

  1. {
  2. 'type': 'emp',
  3. 'id': 7782,
  4. 'name': 'Blake',
  5. 'job': 'Clark',
  6. 'manager': 7839,
  7. 'salary': 2450,
  8. 'dept_id': 'dept__10'
  9. }

这仅显示文档,在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,“排序”元素和名称(啤酒或啤酒厂)的复合键。 因此,视图的地图功能如下所示:

  1. function (doc, meta) {
  2. if (doc.type == "emp" || doc.type == "dept") {
  3. switch(doc.type) {
  4. case "dept" :
  5. emit( [meta.id, , doc.name], );
  6. break;
  7. case "emp" :
  8. emit( [doc.dept_id, 1, doc.name ], doc.salary + ((doc.comm)?doc.comm:) );
  9. break;
  10. }
  11. }
  12. }

密钥包括:

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

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

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

啤酒样品申请

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

  1. function(doc, meta) {
  2. switch(doc.type) {
  3. case "brewery":
  4. emit([meta.id, , doc.name]);
  5. break;
  6. case "beer":
  7. if (doc.name && doc.brewery_id) {
  8. emit([doc.brewery_id, 1, doc.name], null);
  9. }
  10. }
  11. }

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

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

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

  1. View view = client.getView("brewery", "all_with_beers");
  2. Query query = new Query();
  3. query.setIncludeDocs(true).setLimit(100);
  4. ViewResponse result = client.query(view, query);
  5. ArrayList<HashMap<String, String>> items =
  6. new ArrayList<HashMap<String, String>>();
  7. for(ViewRow row : result) {
  8. HashMap<String, String> parsedDoc = gson.fromJson(
  9. (String)row.getDocument(), HashMap.class);
  10. HashMap<String, String> item = new HashMap<String, String>();
  11. item.put("id", row.getId());
  12. item.put("name", parsedDoc.get("name"));
  13. item.put("type", parsedDoc.get("type"));
  14. items.add(item);
  15. }
  16. request.setAttribute("items", items);
  17. request.getRequestDispatcher("/WEB-INF/breweries/all.jsp")
  18. .forward(request, response);

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

  1. <table id="brewery-table" class="table table-striped">
  2. <thead>
  3. <tr>
  4. <th>Name</th>
  5. <th></th>
  6. <th></th>
  7. </tr>
  8. </thead>
  9. <tbody>
  10. <c:forEach items="${items}" var="item">
  11. <c:if test="${ item.type == 'brewery' }">
  12. <tr>
  13. <td colspan="2"><strong><a href="/breweries/show/${item.id}">${item.name}</a></strong></td>
  14. <td><a class="btn btn-small btn-danger" href="/breweries/delete/${item.id}">Delete</a>
  15. </td>
  16. </tr>
  17. </c:if>
  18. <c:if test="${ item.type == 'beer' }">
  19. <tr>
  20. <td></td>
  21. <td><a href="/beers/show/${item.id}">${item.name}</a></td>
  22. <td>
  23. <a class="btn btn-small btn-danger" href="/beers/delete/${item.id}">Delete</a>
  24. <a class="btn btn-small btn-warning" href="/beers/edit/${item.id}">Edit</a>
  25. </td>
  26. </tr>
  27. </c:if>
  28. </c:forEach>
  29. </tbody>
  30. </table>

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

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

分享好友

分享这个小栈给你的朋友们,一起进步吧。

Couchbase
创建时间:2022-04-11 10:08:07
Couchbase
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • LCR_
    专家
戳我,来吐槽~