数据库管理271期 2024-12-14
- 数据库管理-第271期 Oracle 23ai:用MongoDB的方式来操作JSON二元性(20241214)
- 1 初始化数据
- 1.1 创建用户
- 1.2 导入数据
- 1.3 创建JSON关系二元性视图
- 2 创建ORDS服务
- 2.1 下载JDK17
- 2.2 安装ORDS
- 2.3 启用MongoDB API
- 2.4 启动ORDS
- 2.5 创建ORDS服务
- 3 CURL操作JSON关系二元性视图
- 3.1 简单查询
- 3.2 复杂查询
- 3.3 基于_id查询
- 3.4 插入数据
- 3.5 修改数据
- 3.6 删除操作
- 4 MongoDB客户端操作JSON关系二元性视图
- 总结
数据库管理-第271期 Oracle 23ai:用MongoDB的方式来操作JSON二元性(20241214)
作者:胖头鱼的鱼缸(尹海文)
Oracle ACE Pro: Database
PostgreSQL ACE Partner
10年数据库行业经验
拥有OCM 11g/12c/19c、MySQL 8.0 OCP、Exadata、CDP等认证
墨天轮MVP,ITPUB认证专家,数盟会长老会成员,OCM讲师,PolarDB开源社区、青学会MOP社区技术顾问,HaloDB外聘技术顾问,OceanBase观察团成员
圈内拥有“总监”称号,非著名社恐(社交恐怖分子)
公众号:胖头鱼的鱼缸;CSDN:胖头鱼的鱼缸(尹海文);墨天轮:胖头鱼的鱼缸;ITPUB:yhw1809。
除授权转载并标明出处外,均为“非法”抄袭
JSON关系二元性视图是Oracle 23c/23ai引入的一个非常厉害的新特性(具体可以查看第184和185期),本期使用的数据也是源自于184、185期,使用curl来操作JSON关系二元性视图
1 初始化数据
和270期对AI的数据库一致,数据库基本连接信息为:10.10.10.31:1521/pdbprod1(PDB)。
1.1 创建用户
alter session set container=pdbprod1;
create user mongo identified by mongo;
grant DB_DEVELOPER_ROLE to mongo;
alter user mongo default tablespace users quota unlimited on users;
1.2 导入数据
conn mongo/mongo@10.10.10.31:1521/pdbprod1
--建表语句和数据插入详见184、185期
1.3 创建JSON关系二元性视图
这里只创建订单维度的视图:
CREATE or REPLACE JSON DUALITY VIEW orders_jdv AS
orders @insert @update @delete
{_id : order_id,ordertime : order_time,customers @unnest @insert @update{cid : customer_id,customer : customer_name},details : order_details @insert @update @delete[ {subid : sub_idproducts @insert @update{pn : product_id,pname : product_name,price : price_number, product_type @unnest @insert @update{typeid : type_id,type : type_name}}} ]
};
2 创建ORDS服务
Oracle REST Data Services (ORDS) 让您的Oracle数据库启用HTTPS功能。作为一个中间层Java应用,ORDS提供了数据库管理REST API、SQL Developer Web、PL/SQL网关和适用于REST的SODA,并且支持发布RESTful Web服务,可与Oracle数据库中的数据和存储过程进行交互。这里也是用ORDS服务来对接JSON关系二元性视图。
2.1 下载JDK17
JDK17下载地址(使用JDK 17.0.12):https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html
tar -xvf jdk-17.0.12_linux-x64_bin.tar.gz
echo -e 'export JAVA_HOME=/home/oracle/jdk-17.0.12' >> ~/.bash_profile
2.2 安装ORDS
ORDS下载地址为(使用最新版24.4):https://www.oracle.com/cn/database/sqldeveloper/technologies/db-actions/download/
mkdir ords/
mv ords-latest.zip ords/
cd ords/
unzip ords-latest.zipmkdir conf/echo -e 'export PATH="$PATH:/home/oracle/ords/bin"' >> ~/.bash_profile
echo -e 'export ORDS_CONFIG=/home/oracle/ords/conf' >> ~/.bash_profileords install
需要数据库的相关信息:
这时会启动ORDS,Ctrl+C终止即可:
2.3 启用MongoDB API
ords config set mongo.enabled true
ords config set mongo.tls false
2.4 启动ORDS
ords serve
这里会输出一些启动日志,包括REST API的端口,以及MongoDB客户端连接到数据库的字符串。
2.5 创建ORDS服务
grant soda_app to mongo;
conn mongo/mongo@10.10.10.31:1521/pdbprod1
exec ords.enable_schema;DECLARE PRAGMA AUTONOMOUS_TRANSACTION;
BEGINORDS.ENABLE_OBJECT(p_enabled => TRUE,p_schema => 'MONGO',p_object => 'ORDERS_JDV',p_object_type => 'VIEW',p_object_alias => 'orders_jdv',p_auto_rest_auth => FALSE);commit;
END;
/
3 CURL操作JSON关系二元性视图
ORDS启动后,根据启动日志可以看到可以通过8080端口使用REST API操作JSON二元性视图。
3.1 简单查询
curl -s http://10.10.10.31:8080/ords/mongo/orders_jdv/ | jq .
curl -s 'http://10.10.10.31:8080/ords/mongo/orders_jdv/?offset=3&limit=1' | jq .
3.2 复杂查询
curl -s --globoff 'http://10.10.10.31:8080/ords/mongo/orders_jdv/?filter={"details":"$elemMatch":{{"products.pname":"pork"}}}' | jq .
这里可以查出带有Pork为商品的订单(这里不全截图了):
3.3 基于_id查询
curl -s http://10.10.10.31:8080/ords/mongo/orders_jdv/12345681 | jq .
3.4 插入数据
curl -s -X POST 'http://10.10.10.31:8080/ords/mongo/orders_jdv/' \
--header 'Content-Type: application/json' \
--data '{"_id": "123456786", "ordertime": "2024-12-13T13:33:33", "cid": "345678", "customer": "Haiwen","details": [{"subid": 21,"products": {"pn": 98765,"pname": "Laptop mode A","price": 2000,"typeid": 1234,"type": "computer"}},{"subid": 22,"products": {"pn": 87654,"pname": "CD A","price": 40,"typeid": 2345,"type": "music"}}]
}' | jq .
在关系表中也能查询到相关数据:
3.5 修改数据
curl -s -X PUT 'http://10.10.10.31:8080/ords/mongo/orders_jdv/123456786' \
--header 'Content-Type: application/json' \
--data '{"_id": "123456786", "_metadata" : {"etag" : "5F43B20AECD5EFF7CF022352530E3C75"},"ordertime": "2024-12-11T13:33:33", "cid": "345678", "customer": "Haiwen","details": [{"subid": 21,"products": {"pn": 76543,"pname": "Pork","price": 15,"typeid": 3456,"type": "food"}},{"subid": 22,"products": {"pn": 65432,"pname": "Oracle 23ai Document","price": 100,"typeid": 4567,"type": "book"}}]
}' | jq .
在关系表中也能查询到数据已变更:
3.6 删除操作
curl -s -X DELETE http://10.10.10.31:8080/ords/mongo/orders_jdv/123456786 | jq .
关系表中相关数据已删除:
4 MongoDB客户端操作JSON关系二元性视图
可以使用MongoDB官方提供的MongoDB Compass直接连接到Oracle 23ai的JSON关系二元性视图中。
由于前面已经使用CURL操作过,这里就不再使用MongoDB Compass进行操作演示了,连接字符串可以根据ORDS的启动日志获取,连接过程非常丝滑。
总结
本期演示了用使用MongoDB的方式来操作Oracle 23ai JSON关系二元性视图。
老规矩,知道写了些啥。