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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

couchbase_使用Couchbase分页

發布時間:2023/12/3 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 couchbase_使用Couchbase分页 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

couchbase

如果在對Couchbase集群進行查詢時必須處理大量文檔,則使用分頁來逐頁獲取行很重要。 您可以在“ 分頁 ”一章的文檔中找到一些信息,但是我想在本文中詳細介紹示例代碼。

在此示例中,我將基于啤酒樣本數據集創建一個簡單的視圖,該視圖用于按國家/地區查找啤酒廠:

function (doc, meta) {if (doc.type == "brewery" && doc.country){emit(doc.country);} }

該視圖按國家列出所有啤酒廠,索引如下:

文件編號 鍵 值
狂暴者 阿根廷 空值
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 澳大利亞 空值
查詢第2頁
?limit = 5&startkey =“澳大利亞”&startkey_docid = carlton_and_united_breweries&skip = 1
6 coopers_brewery 澳大利亞 空值
7 寄養人_s_澳大利亞_公司 澳大利亞 空值
8 gold_coast_brewery 澳大利亞 空值
9 lion_nathan_australia_hunter_street 澳大利亞 空值
10 little_creatures_brewery 澳大利亞 空值
查詢第3頁
?limit = 5&startkey =“澳大利亞”&startkey_docid = little_creatures_brewery&skip = 1
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在線教程

參考:來自Tug博客博客的JCG合作伙伴 Tugdual Grall 使用Couchbase進行分頁 。

翻譯自: https://www.javacodegeeks.com/2013/10/pagination-with-couchbase.html

couchbase

總結

以上是生活随笔為你收集整理的couchbase_使用Couchbase分页的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。