网站首页设计收费,上海赶集网站建设,青岛网站建设seo优化,徐州建设工程招标信息网官网couchbase如果在对Couchbase集群进行查询时必须处理大量文档#xff0c;则使用分页来逐页获取行很重要。 您可以在“ 分页 ”一章的文档中找到一些信息#xff0c;但是我想在本文中详细介绍示例代码。 在此示例中#xff0c;我将基于啤酒样本数据集创建一个简单的视图… 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 5skip0 页面2limit 5skip 5 … 页面xlimit 5skiplimit *page-1 您显然可以使用进行范围或键查询startkey / endkey键键和排序选项降序所需的任何其他参数。 这是简单但不是最有效的方法因为查询引擎必须读取与查询匹配的所有行直到达到跳过值。 python中的一些代码示例使用此视图进行分页 from couchbase import Couchbase
cb Couchbase.connect(bucketbeer-sample)hasRow True
rowPerPage 5
page 0
currentStartkey
startDocIdwhile hasRow :hasRow Falseskip 0 if page 0 else 1page page 1print -- Page %s -- % (page)rows cb.query(test, by_country, limitrowPerPage, skipskip, startkeycurrentStartkey, startkey_docidstartDocId)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 5startkey “澳大利亚”startkey_docid carlton_and_united_breweriesskip 1 6 coopers_brewery 澳大利亚 空值 7 寄养人_s_澳大利亚_公司 澳大利亚 空值 8 gold_coast_brewery 澳大利亚 空值 9 lion_nathan_australia_hunter_street 澳大利亚 空值 10 little_creatures_brewery 澳大利亚 空值 查询第3页 limit 5startkey “澳大利亚”startkey_docid little_creatures_breweryskip 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(bucketbeer-sample)hasRow True
rowPerPage 5
page 0
currentStartkey
startDocIdwhile hasRow :hasRow Falseskip 0 if page 0 else 1page page 1print -- Page %s -- % (page)rows cb.query(test, by_country, limitrowPerPage, skipskip, startkeycurrentStartkey, startkey_docidstartDocId)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(--------------------------------------------------------------------------);ListURI uris new LinkedListURI();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它将使用LIMITOFFSET参数为开发人员提供更多选项包括分页例如 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.htmlcouchbase