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
總結
以上是生活随笔為你收集整理的couchbase_Couchbase 2.0归类视图简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Windows】外接USB键盘报“无法
- 下一篇: GWT HTTP请求替代