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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346687.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Network下方什么请求也没有_今日头条上传图片时设置封面图报像素低的原因是什么...

今日头条发表原创图文时&#xff0c;在设置文章封面三张图时&#xff0c;有时候会遇到错误信息“部分图片实际像素低于172*120, 不支持设置为封面”。然而我上传的每张图片都是大小超过4MB的高清晰图片&#xff0c;怎么可能像素低于172 * 120? 因为我是个程序猿&#xff0c;所…

php提前用户系统时间限制,php date()比服务器时间提前一小时(DST问题)

我正在尝试排除故障并解决此问题:我正在使用的服务器(Linux上的PHP5.2.9)具有正确的本地时间(美洲/布宜诺斯艾利斯):userserver [/home/site/public_html]$ dateMon Nov 1 17:11:14 ART 2010php.ini设置为date.timezone "America/Buenos_Aires"ini_set(display_erro…

单缝衍射matlab,MATLAB模拟光的单缝衍射

我使用32位R2012a版&#xff0c;32位windows 7系统模拟此程序时第一句出现错误&#xff0c;不知道是什么原因。第一次学习使用MATLAB&#xff0c;希望老师们能帮助&#xff0c;谢谢您们。function Varargoutmygui_1002(varargin)gui_Singleton1;gui_Statestruct(gui Name, mf…

认识适配器:JSON绑定概述系列

适配器通过实现JsonbAdapter接口来配置自定义对象的创建和序列化。 方法AdaptToJson&#xff08;&#xff09;和AdaptFromJson&#xff08;&#xff09;被执行序列化和反序列化操作的逻辑覆盖。 下一篇文章介绍了使用自定义序列化器和反序列化器自定义JSON-B的最高级方法。 在…

微软新浏览器_要超越Chrome?微软新发布的这款浏览器,有翻天覆地的变化!

可爱的分割线系统迷还记得&#xff0c;当年Edge浏览器刚发布的时候&#xff0c;真的是备受期待。可惜的是&#xff0c;由于其糟糕的体验&#xff0c;以及不完善的插件&#xff0c;最终让它变成了第二个IE。可能是出于无奈&#xff0c;微软选择放弃自家渲染引擎&#xff0c;改用…

centos mount 用法_linux screen的用法 - mouseleo

12016.04.02 17:34:56字数 1,019阅读 26,104大家在初次接触linuxVPS时&#xff0c;会发现linux操作和windows操作太不相同的&#xff0c;windows都是图形操作界面&#xff0c;而linux一般是命令行操作&#xff0c;当然&#xff0c;linux也有图形操作界面&#xff0c;但是我们在…

php memcache 封装类,php 封装memcache类

/** memcache类*/class Memcacheds{//声明静态成员变量private static $m null;private static $cache null;private function __construct() {self::$m new Memcache();self::$m->connect(www.cat.com,11211); //写入缓存地址,端口}//为当前类创建对象private static fu…

jedis入门_Jedis入门

jedis入门嗨&#xff0c;这些天我开始研究Redis。 我听说过很多&#xff0c;所以我决定尝试一下。 Redis在其网站上定义为“ 开源高级键值存储”。 它通常被称为数据结构服务器&#xff0c;因为键可以包含字符串&#xff0c;哈希&#xff0c;列表&#xff0c;集合和排序集合 。…

电脑动态壁纸_每日壁纸—水彩插画少女动漫手机高清无水印壁纸第二波

- End -猜你喜欢&#xff1a;看新闻竟然可以赚钱&#xff1f;&#xff1f;&#xff1f;朋友圈千万别设置三天可见&#xff01;哈哈哈~圣诞节&#xff0c;你收到过的奇葩礼物是什么&#xff1f;教你玩赚支付宝红包攻略&#xff0c;如何领大额红包&#xff01;&#xff01;&#…

php赋值 jq,使用js和jQuery如何实现指定赋值方法

下面我就为大家分享一篇js和jQuery以及easyui实现对下拉框的指定赋值方法&#xff0c;具有很好的参考价值&#xff0c;希望对大家有所帮助。js实现&#xff1a;1. 通过让第i个option为selected实现选中第i个&#xff0c;代码如下&#xff1a;(id为下拉框id)(1) document.getEle…

混合云的承诺,收益和产品

云承诺将为我们提供所有灵活性。 有机会在需要时访问无限资源并相应地付款。 我们将不再需要花费时间安装&#xff0c;配置和维护服务器。 我们被承诺将有更多的时间来“仅仅编码”。 取而代之的是&#xff0c;我们越来越多地锁定供应商&#xff0c;而少数云服务商如此之大&am…

c语言汉字属于什么类型_狠准!你的名字属于什么类型 就是什么性格

1.用简体中文写出自己的名字(不包括姓氏),再写出每个字的笔画。2.算出字的总笔画,然后对照下面的表找出对应的。 如:杰伦 8划6划14划阳型(1、10、19、28、37、46、55、64)水型(2、11、20、29、38、47、56、65)空型(3、12、21、30、39、48、57、66)木型(4、13、22、31、40、49、…

javascript里用php,php中使用javascript - 程序园

方法一: 先用PHP生成js代码&#xff0c;然后通过浏览器的自动刷新&#xff0c;将javascript变量传递到PHP脚本中。注意&#xff1a;在实际应用中要防止用户在地址栏内更改传递的变量值。if($qq) echo $qq.;else echo "";echo $qq;?>方法二&#xff1a;先用docume…

java架构师_成为一名Java高级架构师究竟要学哪些东西??

Java架构师&#xff0c;应该算是一些Java程序员们的一个职业目标了吧。很多码农码了五六年的代码也没能成为架构师。那成为Java架构师要掌握哪些技术呢&#xff0c;总体来说呢&#xff0c;有两方面&#xff0c;一个是基础技术&#xff0c;另一个就是组织能力和提出解决方案能力…

php53 php55区别,详解 PHP 中的三大经典模式

原文&#xff1a;https://www.cnblogs.com/heyue0117/p/11869676.html单例模式单例模式的含义:作为对象的创建模式&#xff0c;单例模式确保某一个类只有一个实例&#xff0c;而且自行实例化并向整个系统全局地提供这个实例。它不会创建实例副本&#xff0c;而是会向单例类内部…

javafx中的tree_JavaFX中的塔防(3)

javafx中的tree在最后一部分中&#xff0c;您了解了如何创建Sprite&#xff0c;为其设置动画并赋予其Behavior。 但是动画效果不是很好&#xff0c;因为作为Insectoid&#xff0c;您应该总是在飞行的地方看。 记住&#xff1a;安全第一&#xff01; 我们可以通过创建自定义的Ti…

ie浏览器升级_IE 被微软专家从浏览器里除名了,专家说它只是个兼容性解决方案...

随着 Chrome 等第三方浏览器的崛起&#xff0c;以及微软 Edge 浏览器的替代&#xff0c;家喻户晓的 IE 浏览器正在走向边缘化。2016 年&#xff0c;IE 浏览器的市场份额下跌了 55%。随之而来着来的还有用户的种种恶搞&#xff0c;IE 的反应慢、易崩溃都成了读者制图时讽刺的目标…

谱修正 matlab,自适应谱修正LU分解法解算高病态法方程

自适应谱修正LU分解法解算高病态法方程谱修正迭代算法及其改正算法均没有很好地解决收敛速度与降低矩阵病态性之间的矛盾,且改进算法的阻尼因子缺乏有效的确定方法。针对该问题,提出自适应谱修正(本文共5页)阅读全文>>随着固体激光向高能量和超短脉冲方向快速发展,其对高…

dos命令行设置网络优先级_替代windows系统下cmd的10款命令行工具

喜欢用linux系统的或者从事开发编程的朋友可能会经常用到命令行工具&#xff0c;下面会整理一些windows下命令行工具。1.powershell系统自带powershell它可以说cmd的升级版、补充版&#xff0c;PowerShell需要.NET环境的支持&#xff0c;借助.NET Framework平台强大的类库&…

Spring Cloud Gateway –配置简单路由

可以将Spring Cloud Gateway视为Spring Cloud Netflix Zuul项目的后续产品&#xff0c;并有助于在微服务环境中实现Gateway模式 。 它建立在 Spring Boot 2和Spring Webflux端到端都是无阻塞的-它公开了一个基于Netty的服务器&#xff0c;使用基于Netty的客户端进行下游微服务…