日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

couchbase_Couchbase 2.0归类视图简介

發(fā)布時間:2023/12/3 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 couchbase_Couchbase 2.0归类视图简介 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

couchbase

大多數(shù)應(yīng)用程序必須處理“主/詳細(xì)”類型的數(shù)據(jù):

  • 啤酒廠和啤酒
  • 部門和員工
  • 發(fā)票和項目

例如,創(chuàng)建如下所示的應(yīng)用程序視圖是必需的:

借助Couchbase和許多面向文檔的數(shù)據(jù)庫,您可以使用不同的方式來處理此問題,您可以:

  • 為每個母版創(chuàng)建一個文檔,并將所有子級嵌入其中
  • 創(chuàng)建一個主文檔和子文檔,并使用一個屬性鏈接它們。

在第一種情況下,所有信息都存儲在一個文檔中,使用整個數(shù)據(jù)集非常容易,例如,創(chuàng)建一個顯示所有信息的屏幕,但是第二種情況呢? 在這篇文章中,我將解釋如何使用Couchbase視圖來處理該問題,并使其易于創(chuàng)建主視圖/詳細(xì)視圖。 作為前Oracle員工,我將使用臭名昭著的SCOTT模式以及DEPT和EMP表作為第一個示例。 然后最后,我將其擴(kuò)展到Couchbase隨附的啤酒樣本數(shù)據(jù)。

數(shù)據(jù)

Couchbase是一個無模式的數(shù)據(jù)庫,您可以在其中存儲“任何內(nèi)容”,但是為此,您需要使用JSON文檔并創(chuàng)建兩種文檔類型:“部門”和“員工”。 我們通常這樣做的方法是使用技術(shù)屬性來鍵入文檔。 因此,員工和部門文檔如下所示:

部門

{'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)。 對于此示例,我使用一個簡單的模式:
type__id,對于這些文檔,鍵如下所示:

  • 部__10
  • emp__20

您可以使用任何模式來創(chuàng)建密鑰,例如,為可以選擇放置電子郵件的員工創(chuàng)建密鑰。 請注意員工文檔中的“ dept_id”屬性。 這是部門的關(guān)鍵; 您可以將其視為“外鍵”。 但是請記住,部門文檔和員工文檔之間的關(guān)系完全由應(yīng)用程序管理,Couchbase Server不會強(qiáng)制執(zhí)行它。 我創(chuàng)建了一個包含所有數(shù)據(jù)的Zip文件,您可以從此處下載該文件; 并使用cbdocloader實用程序?qū)?shù)據(jù)導(dǎo)入Couchbase。 要導(dǎo)入數(shù)據(jù),請從終端窗口運行以下命令:

./cbdocloader -n 127.0.0.1:8091 -u Administrator -p password -b default ~/Downloads/emp-dept.zip

您可以在文檔中了解有關(guān)cbdocloader工具的更多信息。

風(fēng)景

Couchbase中的查詢基于視圖 ; 和視圖建立索引,因此我們必須創(chuàng)建一個視圖,準(zhǔn)確地說是一個“整理視圖”。 整理視圖的想法是產(chǎn)生一個索引,在該索引中對鍵進(jìn)行排序,以便首先顯示父ID,然后是其子ID。 因此,我們正在生成一個如下所示的索引:

DEPT_10,會計
DEPT_10,布萊克
DEPT_10,米勒 DEPT_20,研究中 DEPT_20,亞當(dāng)斯 福特DEPT_20 …

實際上,使用Couchbase視圖非常容易。 這里唯一的技巧是控制順序,并確保主控始終是第一個,緊接其子級。 因此,為了控制它,我們可以創(chuàng)建一個包含部門ID,“排序”元素和名稱(啤酒或啤酒廠)的復(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ù)文檔類型從部門文檔本身或從員工文檔中提取的部門ID
  • 用于控制排序的任意數(shù)字。 我為部門放0,為員工放1
  • 部門或雇員的名稱,這也允許按名稱對結(jié)果進(jìn)行排序

除密鑰外,此視圖還用于發(fā)出有關(guān)員工薪水的一些信息。 工資只是工資加上傭金(如果存在)的總和。 視圖的結(jié)果如下所示:

通過此視圖,您現(xiàn)在可以使用視圖結(jié)果為您的應(yīng)用程序生成報告。 也可以在查詢中使用參數(shù)僅查看部分?jǐn)?shù)據(jù),例如按部門查看,例如使用startkey = ['dept__20',0]&endkey = ['dept__20',2]僅查看數(shù)據(jù)-部門和雇員-部門20-研究。

啤酒樣品申請

您可以為啤酒樣品應(yīng)用程序創(chuàng)建一個等效視圖,在同一視圖中打印所有啤酒廠和啤酒。 在設(shè)計文檔“釀酒廠”中,該視圖稱為“ 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)用程序中使用它,對于本示例,我已經(jīng)修改了Java示例應(yīng)用程序。

創(chuàng)建一個servlet來處理用戶請求并在/ 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);

查詢結(jié)果設(shè)置到HttpRequest中,并執(zhí)行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請求中獲取項目并在每個項目上循環(huán),然后根據(jù)項目的類型打印信息。 最終結(jié)果如下所示:

此處提供了Beer Sample應(yīng)用程序的擴(kuò)展: 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

總結(jié)

以上是生活随笔為你收集整理的couchbase_Couchbase 2.0归类视图简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。