热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【TcaplusDB知识库】如何对数组进行操作

【TcaplusDB知识库】TcaplusDB本地索引介绍索引说明TcaplusDB支持两种形式的索引:本地索引和全局索引。本地索引:基于TcaplusDB主键字段建立的索引,在建
【TcaplusDB知识库】如何对数组进行操作

为了支持对数组的灵活操作,即 protobuf 中 repeated 字段,类似 Redis 中对 list、set 等数据结构的操作能力,TcaplusDB 提供对数组的命令式的操作。具备如下能力:



  • PUSH 操作:在数组指定位置插入新的元素数据。

  • SET 操作:修改数组指定位置的元素数据。

  • POP 操作:删除数组中某些下标范围或者满足某些条件的元素。

  • GET 查询:指定记录的 key,查询数组返回数组中某些下标范围或者满足某些条件的元素(即仅记录的局部数据)。


4.1 接口介绍

支持的PUSH、SET、POP操作 使用 UpdateItem 接口,支持的Get使用 Query 接口,其中 generic 表的 coroutine 接口定义如下:

// 入参/出参 msg:包含用户输入的key值,返回修改后的数据也填入到msg
// 入参 operation:数组操作语句,即PUSH、SET、POP
// 入参 condition:记录的过滤条件
int UpdateItem(::google::protobuf::Message *msg, const std::string &operation, const std::string &cOndition= "");
// 入参/出参 msg:包含用户输入的key值,返回查询的局部数据也填入到msg,注意,返回的msg会和输入的msg合并,相当于接口内部调用Message::MergeFrom
// 入参 operation:数组查询语句,即GET
// 入参 queryOption:查询选项,当前仅支持通过TCAPLUS_PB_API_QUERY_RETURN_ARRAY_INDEX指定是否需要返回查询数组元素的原始下标
// 入参 condition:记录的过滤条件
// 出参 vecArrayIndex:若指定TCAPLUS_PB_API_QUERY_RETURN_ARRAY_INDEX,返回查询数组元素的原始下标
int Query(::google::protobuf::Message *msg, const std::string &query, int queryOption, const std::string &condition, std::vector<int> &vecArrayIndex);

4.2 使用示例

这里列举几个使用示例,数组操作的详细语法见下一小节,更多示例见 example。


4.2.1 数组更新示例

user u;
// 设置主键
u.set_id(1);
u.set_name("a");
// 在mailbox数组尾部插入一个元素(同时对元素内的title等字段赋值),这里-1表示尾部的数组下标
int ret = api.UpdateItem(&u, "PUSH mailbox #[-1] [title = \"tcaplus\", cOntent= \"...\"]");
// 当gameids数组不包含101时,在gameids数组头部插入一个元素101,这里0表示头部的数组下标,$表示当前操作的数组元素
// 注意,这里还多了第三个参数,即条件过滤,仅当条件满足时,才执行push操作
ret = api.UpdateItem(&u, "PUSH gameids #[0] [$ = 101]", "gameids NOT CONTAINS($ == 101)");
// 删除mailbox数组下标0 ~ 10范围内,且title不等于"tcaplus"的元素
ret = api.UpdateItem(&u, "POP mailbox #[0-10] [title != \"tcaplus\"]");
// 修改指定下标为1的元素
ret = api.UpdateItem(&u, "SET gameids #[1] [$ = 101]");

4.2.2 数组查询示例

user u;
// 设置主键
u.set_id(1);
u.set_name("a");
// 假设服务端user.mailbox包含4个元素,为
// [ { "tcaplus", "..." }, { "not-tcaplus", "..." }, { "tcaplus", "..." }, { "not-tcaplus", "..." } ]
// 查询mailbox数组下标为0 ~ 2且title为"tcaplus"的元素
// 这里仅返回局部数据,即两个数组元素,并填入u中,也就是说u既作为入参(提供主键),也是出参(包含返回的局部数据)
// option设置TCAPLUS_PB_API_QUERY_RETURN_ARRAY_INDEX时,则也会返回这两个元素的下标,即0和2
int option = 0;
option |= TCAPLUS_PB_API_QUERY_RETURN_ARRAY_INDEX;
std::vector<int> vecArrayIndex;
ASSERT_EQ(0, u.mailbox_size());
int ret = api.Query(&u, "GET mailbox #[0-2] [title == \"tcaplus\"]", option, "", vecArrayIndex);
if (ret == 0) {
ASSERT_EQ(2, u.mailbox_size());
ASSERT_EQ(0, vecArrayIndex[0]);
ASSERT_EQ(2, vecArrayIndex[1]);
}

4.3 语法说明

PUSH 和 SET 语法一样,只有语义上的差异,前者在指定位置插入,后者在指定位置原地修改。

PUSH 和 SET 语法由 3 部分组成,即 数组字段名称 + 下标 + 若干个赋值表达式。其中当元素是组合类型,是各个字段的赋值,当元素是基本类型,使用$引用当前元素进行赋值。

POP 的语法由 3 部分组成,即 数组字段名称 + 下标范围 + 嵌套的过滤条件,后两个是可选的。 和 PUSH 不同,POP 可以某些下标范围而不仅仅是单个下标,这里过滤条件的语法和上一章节记录的过滤条件一样,区别是过来条件的上下文不一样,这里的是元素的数据,而另一个是整个记录的数据。

GET 的语法和 POP 一样。

完整的操作语法如下

push_expr ::=
PUSH array # '[' index ']' '[' assign_expr [, assign_expr]* ']'
set_expr ::=
SET array # '[' index ']' '[' assign_expr[, assign_expr]* ']'
pop_expr ::=
POP array
| POP array # '[' index_range ']'
| POP array # '[' index_range ']' '[' condition ']'
get_expr ::=
GET array
| GET array # '[' index_range ']'
| GET array # '[' index_range ']' '[' condition ']'
assign_expr ::=
identifier = number | string
| $ = number | string
index ::=
integer
index_range ::=
index [, index_range]*
| index - index [, index_range]*


  • 语法说明



  • assign_expr: 赋值表达式,若数组元素是组合类型,则是内部字段的赋值title = \"tcaplus\", cOntent= \"...\",若元素是基本类型,则使用$引用元素本身,如$=101



  • index: 数组的下标,其中 0 表示数组头部下标,在不知道数组大小情况下,使用-1 表示尾部的下标。



  • index_range: 数组下标范围,如 “0 - -1” 表示所有的下标,也可以表示多个不连续的范围,如 “0 - 8, -1”。



  • condition: 嵌套的过滤条件,语法和上一章节记录的条件过滤一致,区别在于,前者的语义上下文是整个记录的数据,这里的是数组元素中的数据。



  • PUSH/SET 的说明



  • 赋值表达式中,当前只支持对整型、浮点、字符串类型的字段赋值,且必须非 repeated 类型,若 repeated 字段本身是基本类型,则使用$引用的元素自身。



  • 赋值表达式中,不同类型整型、浮点型可以相互赋值,即会进行类型强转,有可能出现截断等情况,类型转换的行为和 C++中一致。



  • 对于 SET,若数组大小为 N,下标的有效范围是 0 ~ (N - 1)或-1。



  • 对于 PUSH,若数组大小为 N,下标的有效范围是 0 ~ N 或-1。



  • POP 的说明



  • POP,删除某些范围或某些满足条件的元素。



  • 基于 删除不存在的元素不会报错 的原则,pop 指定一个不存在的下标范围时,不会报错,例如数组大小为 10,8-80会删除最后 2 个元素。





img

TcaplusDB是腾讯出品的分布式NoSQL数据库,存储和调度的代码完全自研。具备缓存+落地融合架构、PB级存储、毫秒级时延、无损水平扩展和复杂数据结构等特性。同时具备丰富的生态、便捷的迁移、极低的运维成本和五个九高可用等特点。客户覆盖游戏、互联网、政务、金融、制造和物联网等领域。



推荐阅读
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 本文比较了eBPF和WebAssembly作为云原生VM的特点和应用领域。eBPF作为运行在Linux内核中的轻量级代码执行沙箱,适用于网络或安全相关的任务;而WebAssembly作为图灵完备的语言,在商业应用中具有优势。同时,介绍了WebAssembly在Linux内核中运行的尝试以及基于LLVM的云原生WebAssembly编译器WasmEdge Runtime的案例,展示了WebAssembly作为原生应用程序的潜力。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 热血合击脚本辅助工具及随机数生成器源码分享
    本文分享了一个热血合击脚本辅助工具及随机数生成器源码。游戏脚本能够实现类似真实玩家的操作,但信息量有限且操作不可控。热血合击脚本辅助工具可以帮助玩家自动刷图、换图拉怪等操作,并提供了雷电云手机的扩展服务。此外,还介绍了使用mt_rand函数作为随机数生成器的代码示例。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 解决Sharepoint 2013运行状况分析出现的“一个或多个服务器未响应”问题的方法
    本文介绍了解决Sharepoint 2013运行状况分析中出现的“一个或多个服务器未响应”问题的方法。对于有高要求的客户来说,系统检测问题的存在是不可接受的。文章详细描述了解决该问题的步骤,包括删除服务器、处理分布式缓存留下的记录以及使用代码等方法。同时还提供了相关关键词和错误提示信息,以帮助读者更好地理解和解决该问题。 ... [详细]
author-avatar
浪漫的白狼族
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有