couchbase_使用Couchbase分页
couchbase
如果在對Couchbase集群進行查詢時必須處理大量文檔,則使用分頁來逐頁獲取行很重要。 您可以在“ 分頁 ”一章的文檔中找到一些信息,但是我想在本文中詳細介紹示例代碼。
在此示例中,我將基于啤酒樣本數據集創建一個簡單的視圖,該視圖用于按國家/地區查找啤酒廠:
該視圖按國家列出所有啤酒廠,索引如下:
| 狂暴者 | 阿根廷 | 空值 |
| cervecera_jerome | 阿根廷 | 空值 |
| brouwerij_nacional_balashi | 阿魯巴島 | 空值 |
| australian_brewing_corporation | 澳大利亞 | 空值 |
| carlton_and_united_breweries | 澳大利亞 | 空值 |
| coopers_brewery | 澳大利亞 | 空值 |
| 寄養人_s_澳大利亞_公司 | 澳大利亞 | 空值 |
| gold_coast_brewery | 澳大利亞 | 空值 |
| lion_nathan_australia_hunter_street | 澳大利亞 | 空值 |
| little_creatures_brewery | 澳大利亞 | 空值 |
| 麥芽鏟子釀酒廠 | 澳大利亞 | 空值 |
| matilda_bay_brewing | 澳大利亞 | 空值 |
| … | … | … |
| … | … | … |
| … | … | … |
| yellowstone_valley_brewing | 美國 | 空值 |
| yuengling_son_brewing | 美國 | 空值 |
| zea_rotisserie_and_brewery | 美國 | 空值 |
| 培養者 | 越南 | 空值 |
| 色相釀酒 | 越南 | 空值 |
因此,現在您要以5行的頁面大小瀏覽此索引。
使用跳過/限制參數
最簡單的方法是使用limit和skip參數,例如:
第1頁:?limit = 5&skip0
頁面2:?limit = 5&skip = 5
…
頁面x:?limit = 5&skip(limit *(page-1))
您顯然可以使用進行范圍或鍵查詢(startkey / endkey,鍵,鍵)和排序選項(降序)所需的任何其他參數。
這是簡單但不是最有效的方法,因為查詢引擎必須讀取與查詢匹配的所有行,直到達到跳過值。
python中的一些代碼示例使用此視圖進行分頁:
from couchbase import Couchbase cb = Couchbase.connect(bucket='beer-sample')hasRow = True rowPerPage = 5 page = 0 currentStartkey="" startDocId=""while hasRow :hasRow = Falseskip = 0 if page == 0 else 1page = page + 1print "-- Page %s --" % (page)rows = cb.query("test", "by_country", limit=rowPerPage, skip=skip, startkey=currentStartkey, startkey_docid=startDocId)for row in rows:hasRow = Trueprint "Country: \"%s\" \t Id: '%s'" % (row.key, row.docid)currentStartkey = row.keystartDocId = row.docidprint " -- -- -- -- \n"該應用程序在所有頁面上循環,直到索引結束。
如前所述,這不是最佳方法,因為系統必須讀取所有值,直到達到跳過為止。 以下示例顯示了解決此問題的更好方法。
使用startkey / startkey_docid參數
為了使這種分頁更加有效,可以采用另一種方法。 此方法使用startkey和startkey_docid選擇適當的文檔。
- startkey參數將是查詢應開始讀取的鍵的值(基于“上一頁”的最后一個鍵)
- 由于對于例如“ Germany”的鍵,您可能具有一個或多個ID(文檔),因此有必要對Couchbase查詢引擎說從哪里開始,為此,您需要使用startkey_docid參數,并忽略此ID,因為它是前一頁的最后一個。
因此,如果我們查看索引,并添加一個行號來說明分頁
| 查詢第1頁 極限= 5 | ||||
| 1個 | 狂暴者 | 阿根廷 | 空值 | |
| 2 | cervecera_jerome | 阿根廷 | 空值 | |
| 3 | brouwerij_nacional_balashi | 阿魯巴島 | 空值 | |
| 4 | australian_brewing_corporation | 澳大利亞 | 空值 | |
| 5 | carlton_and_united_breweries | 澳大利亞 | 空值 | |
| ||||
| 6 | coopers_brewery | 澳大利亞 | 空值 | |
| 7 | 寄養人_s_澳大利亞_公司 | 澳大利亞 | 空值 | |
| 8 | gold_coast_brewery | 澳大利亞 | 空值 | |
| 9 | lion_nathan_australia_hunter_street | 澳大利亞 | 空值 | |
| 10 | little_creatures_brewery | 澳大利亞 | 空值 | |
查詢第3頁
| ||||
| 11 | 麥芽鏟子釀酒廠 | 澳大利亞 | 空值 | |
| 12 | matilda_bay_brewing | 澳大利亞 | 空值 | |
| … | … | … | ||
| … | … | … | ||
| … | … | … | ||
| … | yellowstone_valley_brewing | 美國 | 空值 | |
| … | yuengling_son_brewing | 美國 | 空值 | |
| … | zea_rotisserie_and_brewery | 美國 | 空值 | |
| … | 培養者 | 越南 | 空值 | |
| … | 色相釀酒 | 越南 | 空值 |
因此,如您在上面的示例中看到的那樣,查詢使用startkey和文檔ID,并使用skip = 1傳遞它。
現在,讓我們再次使用Python查看應用程序代碼
from couchbase import Couchbase cb = Couchbase.connect(bucket='beer-sample')hasRow = True rowPerPage = 5 page = 0 currentStartkey="" startDocId=""while hasRow :hasRow = Falseskip = 0 if page == 0 else 1page = page + 1print "-- Page %s --" % (page)rows = cb.query("test", "by_country", limit=rowPerPage, skip=skip, startkey=currentStartkey, startkey_docid=startDocId)for row in rows:hasRow = Trueprint "Country: \"%s\" \t Id: '%s'" % (row.key, row.docid)currentStartkey = row.keystartDocId = row.docidprint " -- -- -- -- \n"該應用程序在所有頁面上循環,直到索引結束
使用這種方法,應用程序開始在特定鍵(startkey參數)處讀取索引,并且僅在索引中的必要條目上循環。 這比使用簡單的跳過方法更有效。
具有減少功能的視圖
當您的視圖使用reduce函數進行分組時,無法使用參數startkey_docid,因為在縮小結果時文檔的ID不可用。
因此,在使用reduce時,必須使用skip和limit參數。
Couchbase Java SDK分頁器
在前面的示例中,我展示了如何使用各種查詢參數進行分頁。 Java SDK提供了一個Paginator對象,以幫助開發人員處理分頁。 以下示例在Paginator API中使用相同的視圖。
package com.couchbase.devday;import com.couchbase.client.CouchbaseClient; import com.couchbase.client.protocol.views.*; import java.net.URI; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Properties; import java.util.concurrent.TimeUnit; import java.util.logging.ConsoleHandler; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.Logger;public class JavaPaginatorSample {public static void main(String[] args) {configure();System.out.println("--------------------------------------------------------------------------");System.out.println("\tCouchbase - Paginator");System.out.println("--------------------------------------------------------------------------");List<URI> uris = new LinkedList<URI>();uris.add(URI.create("http://127.0.0.1:8091/pools"));CouchbaseClient cb = null;try {cb = new CouchbaseClient(uris, "beer-sample", "");System.out.println("--------------------------------------------------------------------------");System.out.println("Breweries (by_name) with docs & JSON parsing");View view = cb.getView("test", "by_country");Query query = new Query();int docsPerPage = 5;Paginator paginatedQuery = cb.paginatedQuery(view, query, docsPerPage);int pageCount = 0;while(paginatedQuery.hasNext()) {pageCount++;System.out.println(" -- Page "+ pageCount +" -- ");ViewResponse response = paginatedQuery.next();for (ViewRow row : response) {System.out.println(row.getKey() + " : " + row.getId());}System.out.println(" -- -- -- ");}System.out.println("\n\n");cb.shutdown(10, TimeUnit.SECONDS);} catch (Exception e) {System.err.println("Error connecting to Couchbase: " + e.getMessage());} }private static void configure() {for(Handler h : Logger.getLogger("com.couchbase.client").getParent().getHandlers()) {if(h instanceof ConsoleHandler) {h.setLevel(Level.OFF);}}Properties systemProperties = System.getProperties();systemProperties.put("net.spy.log.LoggerImpl", "net.spy.memcached.compat.log.SunLogger");System.setProperties(systemProperties);Logger logger = Logger.getLogger("com.couchbase.client");logger.setLevel(Level.OFF);for(Handler h : logger.getParent().getHandlers()) {if(h instanceof ConsoleHandler){h.setLevel(Level.OFF);}} }}如您所見,您可以使用Java Paginator輕松對查詢結果進行分頁。
- 在第37行,使用視圖和查詢對象創建Paginator,并指定頁面大小
- 然后,您只需要使用hasNext()和next()方法來導航結果。
Java Paginator知道他們的查詢使用的是減少還是不使用,因此您可以將其與所有類型的查詢一起使用–在內部,它將在跳過/限制方法和doc_id方法之間切換。 您可以在Paginator類中看到它是如何完成的 。
請注意,如果要在HTTP請求之間的Web應用程序中執行此操作,則必須將Paginator對象保留在用戶會話中,因為當前API會將當前頁面保持在其狀態。
結論
在此博客文章中,您學習了如何在Couchbase視圖中處理分頁。 總結
- 分頁基于您在執行查詢時發送的某些特定參數。
- Java開發人員可以使用簡化分頁的Paginator類。
我邀請您查看仍在開發中的新Couchbase查詢語言N1QL,它將使用LIMIT&OFFSET參數為開發人員提供更多選項,包括分頁,例如:
SELECT fname, age FROM tutorialWHERE age > 30LIMIT 2OFFSET 2如果您想了解有關N1QL的更多信息:
- Couchbase社區門戶上的N1QL
- N1QL在線教程
翻譯自: https://www.javacodegeeks.com/2013/10/pagination-with-couchbase.html
couchbase
總結
以上是生活随笔為你收集整理的couchbase_使用Couchbase分页的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 绝地求生怎样改名字 绝地求生如何改名字
- 下一篇: jedis入门_Jedis入门