使用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 澳大利亚 空值
库珀酿酒厂 澳大利亚 空值
寄养人_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 库珀酿酒厂 澳大利亚 空值
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

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

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

相关文章

android 常用机型尺寸_不同手机/设备和操作系统版本上的Android堆大小

素胚勾勒不出你不仅手机生产商&#xff0c;而且任何创建Android操作系统版本的人&#xff0c;都可以根据设备的特定需求&#xff0c;指定允许的最大堆大小。一些Android根&#xff0c;如CyanogenMod&#xff0c;甚至允许用户自己选择堆大小作为设置。可以使用该方法检测允许的最…

vue移动端项目缓存问题实践

最近在做一个vue移动端项目&#xff0c;被缓存问题搞得头都大了&#xff0c;积累了一些经验&#xff0c;特此记录总结下&#xff0c;权当是最近项目问题的一个回顾吧&#xff01; 先描述下问题场景&#xff1a;A页面->B页面->C页面。假设A页面是列表页面&#xff0c;B页…

pdf解析与结构化提取

PDF解析与结构化提取 PDF解析 对于PDF文档&#xff0c;我们选择用PDFMiner对其进行解析&#xff0c;得到文本。 PDFMiner PDFMiner使用了一种称作lazy parsing的策略&#xff0c;只在需要的时候才去解析&#xff0c;以减少时间和内存的使用。要解析PDF至少需要两个类&#xff1…

Linux usb bus日志如何打开,从linux usb bus节点来认识usb linux usb认识

首先从linux dmesg来认识usb:<6>[ 19.610046] msm_hsic_host msm_hsic_host: Qualcomm EHCI Host Controller using HSIC<6>[ 19.620391] msm_hsic_host msm_hsic_host: new USB bus registered, assigned bus number 1<6>[ 19.659942] msm_hsic_host …

Spring面试问题

还可以查看我们最新的文章69Spring面试问答-最终名单 。 1&#xff09;什么是春天&#xff1f; 回答&#xff1a; Spring是控件和面向方面的容器框架的轻量级转换。 2&#xff09;解释春天&#xff1f; 回答&#xff1a; 轻巧&#xff1a;在尺寸和透明度方面&#xff0c; S…

java 字符串转utc时间_JAVA 本地时间字符串转UTC时间字符串

本来想偷懒百度一个时间字符串转UTC的代码&#xff0c;但发现没有一个能用&#xff0c;写得还复杂得要死&#xff0c;没办法还是自己撸一个。/*** UTC时间字符串转本地时间字符串* 我的本地getDateTimeInstance()是格式&#xff1a;yyyy-MM-dd HH:mm:ss* param str UTC时间字符…

前端解读面向切面编程(AOP)

前言 面向对象(OOP)作为经典的设计范式&#xff0c;对于我们来说可谓无人不知&#xff0c;还记得我们入行起始时那句经典的总结吗-万事万物皆对象。 是的&#xff0c;基于OOP思想封装、继承、多态的特点&#xff0c;我们会自然而然的遵循模块化、组件化的思维来设计开发应用&a…

windows和linux允许分片,请问hadoop的hdfs文件系统和本地windows文件系统或linux文件系统是什么关系啊,谢谢...

虚拟文件系统 Virtual File Systems(VFS)Linux 是近年来发展起来的一种新型的操作系统&#xff0c;其最重要的特征之一就是支持多种文件系统&#xff0c;使其更加灵活&#xff0c;从而与许多其它的操作系统共存。Linux支持ext&#xff0c;ext2&#xff0c;xia&#xff0c;minix…

201771010120 苏浪浪 《面向对象程序设计(java)》第二周学习总结

理论知识总结 第三章Java基本程序设计结构 1、基本知识&#xff1a;&#xff08;1&#xff09;标识符&#xff1a;是由字母、下划线、美元符号和数字组成&#xff0c;且第一个符号不能为数字。&#xff08;2&#xff09;关键字&#xff1a;剧啊语言中被赋予特定意义的一些单词。…

Apache Camel简介

Apache Camel是著名的企业集成模式的开源实现。 Camel是一个路由和中介引擎&#xff0c;可以帮助开发人员以各种领域特定语言&#xff08;DSL&#xff09;&#xff08;例如Java&#xff0c;Spring / XML&#xff0c;scala等&#xff09;创建路由和中介规则。 骆驼用途广泛 Cam…

《架构即未来》读后感

前言 有将近2年没有写文章了&#xff0c;首先是不知道分享什么&#xff0c;其次就是工作也比较忙&#xff0c;闲暇的时间要么玩游戏、听小说、看电影&#xff0c;虽然也有看书但其实也并不多&#xff0c;以上也都是为了我的懒惰所找的一些借口。 虽然到现在为止也看了百来本书&…

qt结构体嵌套结构体方法_9.2 C++结构体类型变量

C定义结构体类型变量的方法 1、先声明结构体类型再定义变量名&#xff0c;在定义了结构体变量后&#xff0c;系统会为之分配内存单元。struct Student{ //自定义结构体变量int num;//学号char sex;//性别int age;//年龄};2、在声明类型的同时定义变量 一般形式为struct 结构体名…

Vue解析--如何应对面试官提问

近期不断面试中&#xff0c;面试官都会提一些关于Vue相关的源码和“全家桶”之类的问题。那么针对这些提问&#xff0c;我们应该如何更好应答呢&#xff1f;在这里我把对Vue的理解整理出来供大家来参考。 1.Vue是什么&#xff1f; Vue是一套构建用户界面的渐进式框架&#xf…

搭建自动安装的linux,RedHat7搭建无人值守自动安装Linux操作系统(PXE+Kickstart)

Kickstart服务器IP: 192.168.136.253 掩码&#xff1a;255.255.255.0 网关&#xff1a;192.168.136.2 DNS&#xff1a;192.168.136.2安装部署yum源服务器参考 http://www.cnblogs.com/edward2013/p/5020113.html安装部署DHCP服务器# yum -y install dhcp修改配置文件# vi…

Numpy数组的保存与读取方法

1. 数组以二进制格式保存 np.save和np.load是读写磁盘数组数据的两个主要函数。默认情况下&#xff0c;数组以未压缩的原始二进制格式保存在扩展名为npy的文件中&#xff0c;以数组a为例 np.save("filename.npy",a)b np.load("filename.npy")利用这种方法…

Java开发人员的Erlang

您可能没有注意到&#xff0c;但是距离我上次发布博客已经过去了几个星期。 原因是我的Soleus骨折了&#xff0c;而我的腿也石膏了。 不能动弹&#xff0c;我认为调查完全不同的东西是个好主意–要么看那天的电视&#xff0c;要么&#xff0c;尽管Kojak和Magnum PI的重播很诱人…

20165339第六周学习总结

课本知识点总结 第八章 String类 使用String类声明对象并创建对象 String s new String("We are students"); String t new String("We are students"); String (char a[])用一个字符数组a创建一个String对象 char a[] {J,a,v,a}; String s new String(a)…

keil5用jlink不到芯片_洛达芯片检测

安卓手机下载一个络达官方的刷机软件然后连接上耳机&#xff0c;打开软件&#xff0c;就可以看到耳机芯片的相关信息。软件下载地址&#xff1a;https://pan.baidu.com/s/1MOXjkHv1wfxWWIVdcsMSFg 提取码: tasc我们的耳机都是络达芯片&#xff0c;不怕你检测&#xff0c;希望用…

层次和约束:项目中使用vuex的3条优化方案

问题描述 使用vuex的store的过程中&#xff0c;发现了一些不是很优雅的地方&#xff1a; store层module太多&#xff0c;找state、getter、mutation、action对应的module比较慢。 组件里面mapGetters、mapActions、mapMutations过多&#xff0c;分不清getter、action、mutati…

linux脚本编写规则,shell脚本编写守则

现在centos7中使用的是bash软件&#xff0c;通过以下命令可以查看bash版本&#xff1a;[rootlocalhost ~]# cat /etc/redhat-release #查看系统的版本CentOS Linux release 7.5.1804 (Core) #我这里使用的是centos 7.5 1804[rootlocalhost ~]# bash --version #查看bash的版本G…