MySQL, Oracle, Linux, 软件架构及大数据技术知识分享平台

网站首页 > 精选文章 / 正文

KingbaseES:平替 MongoDB 等 NoSQL 数据库的实力担当

2025-05-02 18:42 huorong 精选文章 4 ℃ 0 评论

引言

在当今的数据处理领域,NoSQL 数据库如 MongoDB 凭借其灵活的数据模型和高可扩展性,在许多场景中得到广泛应用。然而,传统的关系型数据库也在不断发展和进化,KingbaseES 就是其中的佼佼者。它不仅具备强大的关系型数据处理能力,还在 JSON 数据处理方面表现出色,具备平替 MongoDB 等 NoSQL 数据库的潜力。本文将深入介绍 KingbaseES 在 JSON 数据处理方面的能力,并与 MongoDB 等 NoSQL 数据库进行对比。

一、KingbaseES 与 JSON 数据

1.1 JSON 数据存储基础

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其易于阅读和编写,以及便于机器解析和生成,被广泛应用于各种数据交互场景。KingbaseES 为存储 JSON 数据提供了两种类型:JSON 和 JSONB。JSON 和 JSONB 几乎接受完全相同的值集合作为输入,但 JSONB 存储的是经过解析的二进制格式,查询性能通常更好。

1.2 准备数据

为了更好地展示 KingbaseES 的 JSON 处理能力,我们首先创建一个测试表并插入一些示例数据:

CREATE TABLE "public"."jsontable" (
    "id" integer NULL,
    "jsondata" json NULL,
    "jsonvarchar" varchar NULL,
    "jsonarray" json NULL,
    "jsonrecord" json NULL,
    "jsonset" json NULL
);

INSERT INTO "public"."jsontable" ("id","jsondata","jsonvarchar","jsonarray","jsonrecord","jsonset") VALUES
    (1,'{"f2":{"f3":1},"f4":{"f5":99,"f6":"foo"}}','{"f2": {"f3": 1}, "f4": {"f5": 99, "f6": "foo"}}','[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false,"stringy"]','{"a":1,"b":"bcol","c":"cc"}','[{"a":1,"b":"bcol","c":"cc"},{"a":1,"b":"bcol","d":""}]'),
    (2,'{"a":[1,2,3,4,5]}','{"a": [1, 2, 3, 4, 5]}','[1,2,3,4,5]','{"a":1,"b":"bcol","c":""}','[{"a":1,"b":"bcol","c":""},{"a":1,"b":"bcol","e":""}]');

二、KingbaseES 的 JSON 函数能力

2.1 记录操作函数

2.1.1 JSONB_TO_RECORD

该函数用于解析 JSON 数据并将其转换为记录类型。示例如下:

-- 解析json数据
demo=# SELECT * FROM jsonb_to_record('{"a":1,"b":[1,2,3],"c":[1,2,3],"e":"bar","r": {"a": 123, "b": "a b c"}}') as x(a int,b text);
 a |     b
---+-----------
 1 | [1, 2, 3]
(1 行记录)

需要注意的是,数据 value 的类型需要能够隐式转换到 record 的匹配类型中,若数据中不存在 record 定义的属性时,默认返回 null。

2.1.2 JSONB_TO_RECORDSET

类似于 JSONB_TO_RECORD,不过它可以处理包含多个对象的 JSON 数组,将其转换为记录集。示例:

-- 解析json数据
demo=# SELECT * FROM jsonb_to_recordset ('[{"a":1,"b":"foo","c":true},{"a":"2","b":"bar"}]')as x(a int, b text);
 a |  b
---+-----
 1 | foo
 2 | bar
(2 行记录)

2.1.3 JSONB_POPULATE_RECORD 和 JSONB_POPULATE_RECORDSET

JSONB_POPULATE_RECORD 用于将 JSON 对象扩展成一个行,其列匹配由 base 定义的记录类型;JSONB_POPULATE_RECORDSET 则用于处理 JSON 数组,将其转换为记录集。示例:

-- 创建自定义的 SQL 类型
CREATE TYPE recordtype as (a INT, b text, c text);

-- 解析json数据
demo=# SELECT * FROM jsonb_populate_record(NULL::recordtype , '{"a":1,"b":"bcol","c":"c_text"}');
 a |  b   |   c
---+------+--------
 1 | bcol | c_text
(1 行记录)

-- 直接解析json数据
demo=# SELECT * FROM jsonb_populate_recordset(NULL::recordtype , '[{"a":1,"b":"bcol","c":"cc"},{"a":1,"b":"bcol","c":"c_dd"}]');
 a |  b   |  c
---+------+------
 1 | bcol | cc
 1 | bcol | c_dd
(2 行记录)

2.2 数据操作函数

2.2.1 JSON_QUERY

JSON_QUERY 支持部分函数的使用(size,type,double,ceiling,floor,abs),还可用于数组数据检索和数据筛选。示例:

-- JSON_basic_path_expression支持部分函数的使用(size,type,double,ceiling,floor,abs)
demo=# select json_query('[1,2,3,4,5]'::jsonb,'$.size()') ;
 json_query
------------
 5
(1 行记录)

-- JSON_basic_path_expression数组数据检索
demo=# select json_query('{"a": [1, 2, 3, 4, 5], "b": ["2", "a b"], "c": {"d": 4, "e": "ab c"}}'::jsonb,'$.a');
   json_query
-----------------
 [1, 2, 3, 4, 5]
(1 行记录)

2.2.2 JSON_OBJECTAGG

用于将多行数据聚合为一个 JSON 对象。示例:

-- 常用方式查询
demo=# select json_objectagg(id : name) from comtable ;
           json_objectagg
-------------------------------------
 { "1" : "a", "2" : "b", "3" : "c" }
(1 行记录)

需要注意的是,json 对象 key 字段不能为空,且若存在重复 key 值,可通过with unique keys选项进行限制。

2.2.3 JSONB_SET 和 JSONB_INSERT

JSONB_SET 用于修改 JSON 对象或数组中的值;JSONB_INSERT 用于在 JSON 对象或数组中插入新值。示例:

-- json数组中,path值'{p1,p2}',p1:表示数组位置;p2:表示具体的key值。
demo=# SELECT jsonb_set('[{"f1":1,"f2":null},2,null,3]', '{0,f1}', '[2,3,4]', false);
                  jsonb_set
---------------------------------------------
 [{"f1": [2, 3, 4], "f2": null}, 2, null, 3]
(1 行记录)

-- 插入新值数据
demo=# SELECT JSONB_INSERT('[{"f1":1,"f2":null},2,null,3]', '{0,f3}', '[2,3,4]', false);
                     JSONB_INSERT
------------------------------------------------------
 [{"f1": 1, "f2": null, "f3": [2, 3, 4]}, 2, null, 3]
(1 行记录)

2.3 其他函数

2.3.1 JSONB_TYPEOF

用于判断 JSON 值的类型。示例:

demo=# SELECT jsonb_typeof('true');
 jsonb_typeof
--------------
 boolean
(1 行记录)

三、KingbaseES 与 MongoDB 等 NoSQL 数据库对比

3.1 数据模型灵活性

MongoDB 等 NoSQL 数据库以其灵活的数据模型著称,无需预定义表结构,可随时存储不同结构的数据。KingbaseES 虽然是关系型数据库,但通过 JSON 和 JSONB 类型,也能在一定程度上实现数据模型的灵活性,存储结构多变的 JSON 数据。

3.2 查询性能

在处理大规模 JSON 数据时,MongoDB 的查询性能通常较好,尤其是在复杂的嵌套文档查询方面。而 KingbaseES 的 JSONB 类型经过优化,在某些场景下也能提供不错的查询性能,并且可以结合传统的 SQL 查询功能,实现更强大的查询能力。

3.3 事务处理

MongoDB 在早期版本中对事务的支持较弱,虽然现在有了一定的改进,但相比之下,KingbaseES 作为传统的关系型数据库,具有成熟的事务处理机制,能够更好地保证数据的一致性和完整性。

3.4 生态系统

MongoDB 拥有庞大的生态系统,有丰富的工具和框架支持,适用于快速开发和迭代的项目。KingbaseES 也在不断完善其生态系统,并且与传统的关系型数据库生态兼容性更好,对于熟悉 SQL 和关系型数据库的开发者来说,更容易上手和集成。

四、结论

KingbaseES 在 JSON 数据处理方面展现出了强大的能力,具备平替 MongoDB 等 NoSQL 数据库的潜力。它结合了关系型数据库的优势和对 JSON 数据的良好支持,在数据模型灵活性、查询性能、事务处理和生态系统等方面都有自己的特点。在选择数据库时,开发者应根据具体的业务需求、数据特点和团队技术栈来综合考虑,KingbaseES 无疑是一个值得考虑的选择。

希望通过本文的介绍,能让大家对 KingbaseES 在 JSON 数据处理方面的能力有更深入的了解,也能为数据库选型提供一些参考。如果你对 KingbaseES 或 JSON 数据处理有任何疑问,欢迎在评论区留言讨论。

Tags:mongodb 工具

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言