Couchbase 2.0归类视图简介
大多數(shù)應(yīng)用程序必須處理“主/詳細(xì)”類(lèi)型的數(shù)據(jù):
- 啤酒廠和啤酒
- 部門(mén)和員工
- 發(fā)票和項(xiàng)目
- …
例如,這對(duì)于創(chuàng)建如下應(yīng)用程序視圖是必需的:
借助Couchbase和許多面向文檔的數(shù)據(jù)庫(kù),您可以采用不同的方式來(lái)處理此問(wèn)題,您可以:
- 為每個(gè)母版創(chuàng)建一個(gè)文檔,并將所有子級(jí)嵌入其中
- 創(chuàng)建一個(gè)主文檔和子文檔,并使用屬性鏈接它們。
在第一種情況下,所有信息都存儲(chǔ)在一個(gè)文檔中,使用整個(gè)數(shù)據(jù)集非常容易,例如,創(chuàng)建一個(gè)顯示所有信息的屏幕,但是第二種情況呢? 在這篇文章中,我將解釋如何使用Couchbase視圖來(lái)處理該問(wèn)題,并使其易于創(chuàng)建主視圖/詳細(xì)視圖。 作為前Oracle員工,我將使用臭名昭著的SCOTT模式以及DEPT和EMP表,作為第一個(gè)示例。 然后最后,我將其擴(kuò)展到Couchbase隨附的啤酒樣本數(shù)據(jù)。
數(shù)據(jù)
Couchbase是一個(gè)無(wú)模式的數(shù)據(jù)庫(kù),您可以在其中存儲(chǔ)“任何內(nèi)容”,但是為此,您需要使用JSON文檔并創(chuàng)建兩種類(lèi)型的文檔:“部門(mén)”和“員工”。 我們通常這樣做的方法是使用技術(shù)屬性來(lái)鍵入文檔。 因此,員工和部門(mén)文檔如下所示:
部
{'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中,您必須將文檔與鍵關(guān)聯(lián)。 對(duì)于這個(gè)例子,我使用一個(gè)簡(jiǎn)單的模式:
type__id,對(duì)于這些文檔,鍵如下所示:
- 部__10
- emp__20
您可以使用任何模式來(lái)創(chuàng)建密鑰,例如,可以為您選擇放置電子郵件的員工創(chuàng)建密鑰。 請(qǐng)注意員工文檔中的“ dept_id”屬性。 這是部門(mén)的關(guān)鍵; 您可以將其視為“外鍵”。 但是請(qǐng)記住,部門(mén)文檔和員工文檔之間的關(guān)系完全由應(yīng)用程序管理,Couchbase Server不會(huì)強(qiáng)制執(zhí)行它。 我創(chuàng)建了一個(gè)包含所有數(shù)據(jù)的Zip文件,您可以從此處下載該文件; 并使用cbdocloader實(shí)用程序?qū)?shù)據(jù)導(dǎo)入Couchbase。 要導(dǎo)入數(shù)據(jù),請(qǐng)從終端窗口運(yùn)行以下命令:
./cbdocloader -n 127.0.0.1:8091 -u Administrator -p password -b default ~/Downloads/emp-dept.zip您可以在文檔中了解有關(guān)cbdocloader工具的更多信息。
風(fēng)景
Couchbase中的查詢(xún)基于視圖 ; 和視圖建立索引,因此我們必須創(chuàng)建一個(gè)視圖,準(zhǔn)確地說(shuō)是一個(gè)“整理視圖”。 整理視圖的想法是產(chǎn)生索引,在索引中對(duì)鍵進(jìn)行排序,以便首先顯示父ID,然后是其子ID。 因此,我們正在生成一個(gè)如下所示的索引:
DEPT_10,會(huì)計(jì)
DEPT_10,布萊克
米勒DEPT_10 DEPT_20,研究中 DEPT_20,亞當(dāng)斯 福特DEPT_20 …
實(shí)際上,使用Couchbase視圖非常容易。 這里唯一的技巧是控制順序,并確保主控始終是第一個(gè),緊接其子級(jí)。 因此,為了控制它,我們可以創(chuàng)建一個(gè)包含部門(mén)ID,“排序”元素和名稱(chēng)(啤酒或啤酒廠)的復(fù)合鍵。 因此,視圖的地圖功能如下所示:
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;}} }密鑰包括:
- 根據(jù)文檔類(lèi)型從部門(mén)文檔本身或從員工文檔中提取的部門(mén)ID
- 用于控制排序的任意數(shù)字。 我為部門(mén)放0,為員工放1
- 部門(mén)或雇員的名稱(chēng),這也允許按名稱(chēng)對(duì)結(jié)果進(jìn)行排序
除密鑰外,此視圖還用于發(fā)出有關(guān)員工薪水的一些信息。 工資只是工資加上傭金(如果存在)的總和。 視圖的結(jié)果如下所示:
通過(guò)此視圖,您現(xiàn)在可以使用視圖結(jié)果為您的應(yīng)用程序生成報(bào)告。 也可以在查詢(xún)中使用參數(shù)僅查看部分?jǐn)?shù)據(jù),例如按部門(mén)查看,例如使用startkey = ['dept__20',0]&endkey = ['dept__20',2]僅查看數(shù)據(jù)-研究部的部門(mén)和雇員-。
啤酒樣品申請(qǐng)
您可以為啤酒樣品應(yīng)用程序創(chuàng)建一個(gè)等效視圖,在同一視圖中打印所有啤酒廠和啤酒。 在設(shè)計(jì)文檔“釀酒廠”中,該視圖稱(chēng)為“ 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);}} }一旦將其發(fā)布到生產(chǎn)環(huán)境中,就可以在Beer Sample應(yīng)用程序中使用它,對(duì)于本示例,我已經(jīng)修改了Java示例應(yīng)用程序。
創(chuàng)建一個(gè)servlet來(lái)處理用戶(hù)請(qǐng)求并在/ all URI上。
使用以下代碼調(diào)用視圖的“ 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);查詢(xún)結(jié)果設(shè)置到HttpRequest中,并執(zhí)行all.jsp頁(yè)面。 JSP使用JSTL通過(guò)以下代碼來(lái)打印信息:
<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請(qǐng)求中獲取項(xiàng)目并在每個(gè)項(xiàng)目上循環(huán),然后根據(jù)項(xiàng)目的類(lèi)型打印信息。 最終結(jié)果如下:
此處提供了Beer Sample應(yīng)用程序的擴(kuò)展: https : //github.com/tgrall/beersample-java/tree/BreweriesAndBeers
參考:來(lái)自Tug博客博客的JCG合作伙伴 Tugdual Grall 介紹了使用Couchbase 2.0的整理視圖 。
翻譯自: https://www.javacodegeeks.com/2013/02/introduction-to-collated-views-with-couchbase-2-0.html
總結(jié)
以上是生活随笔為你收集整理的Couchbase 2.0归类视图简介的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 消息称三星 Galaxy Tab S9
- 下一篇: DeferredResult – Spr