• Spring Boot 3.0.x和Oracle Database 23c Database API for MongoDB的示例


    Spring Boot 3.0.x和Oracle Database 23c Database API for MongoDB的示例

    代码地址:https://github.com/engchina/springboot3withdb23c/tree/main/OracleDatabaseAPIForMongoDB

    推荐之前阅读

    加载数据

    本示例服务访问了一家共享单车公司的真实数据。我们在这个例子中使用了他们的数据,因为他们已经干净地暴露了关于其共享单车站点的JSON数据(见https://github.com/NABSA/gbfs/blob/master/gbfs.md)。
    具体来说,这个例子使用了他们的两个数据集。

    • station: 关于每个共享单车站点的JSON数据,包括其名称、位置、最大容量等。
    • status: 关于共享单车站的当前状态的JSON数据,包括当前可用的自行车数量等数据。

    加载这些数据集,我们将使用mongoimport。

    # 用你的数据库的实际URI代替,使用\$external for `$external`
    export URI="mongodb://:27017/mongodb?authMechanism=PLAIN&authSource=\$external&ssl=true&retryWrites=false&loadBalanced=true"
    
    # 使用jq(https://stedolan.github.io/jq/)分开嵌套文件,并将station_id字段改为_id
    curl https://gbfs.citibikenyc.com/gbfs/en/station_information.json | \
    jq -c '.data.stations[] | .["_id"] = .["station_id"] | del(.station_id)' | \
    mongoimport -u <username> -p <password> --collection station --uri $URI
    
    curl https://gbfs.citibikenyc.com/gbfs/en/station_status.json | \
    jq -c '.data.stations[]' | \
    mongoimport -u <username> -p <password> --collection status --uri $URI
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    如果成功,你应该在你的数据库中有两个集合:station和status。注意,你可能想在一段时间内多次运行status命令,以获得更多有趣的(变化的)数据来进行处理。加载的数据是运行命令时station的状态。

    查看数据

    你可以使用mongosh从命令行查看,

    mongosh -u <username> -p <password> $URI
    mongodb> show collections
    station
    status
    mongodb> db.station.find({_id:120})
    [
      {
        _id: '120',
        region_id: '71',
        lon: -73.95928168,
        eightd_has_key_dispenser: false,
        legacy_id: '120',
        rental_methods: [ 'KEY', 'CREDITCARD' ],
        external_id: '66db29e6-0aca-11e7-82f6-3863bb44ef7c',
        capacity: 19,
        short_name: '4452.03',
        lat: 40.68676793,
        electric_bike_surcharge_waiver: false,
        station_type: 'classic',
        eightd_station_services: [],
        has_kiosk: true,
        rental_uris: {
          android: 'https://bkn.lft.to/lastmile_qr_scan',
          ios: 'https://bkn.lft.to/lastmile_qr_scan'
        },
        name: 'Lexington Ave & Classon Ave'
      }
    ]
    mongodb> db.station.updateOne({_id:120}, {$set:{capacity:24}});
    {
      acknowledged: true,
      insertedId: null,
      matchedCount: 1,
      modifiedCount: 1,
      upsertedCount: 0
    }
    mongodb> db.station.find({_id:120});
    [
      {
        _id: '120',
        region_id: '71',
        lon: -73.95928168,
        eightd_has_key_dispenser: false,
        legacy_id: '120',
        rental_methods: [ 'KEY', 'CREDITCARD' ],
        external_id: '66db29e6-0aca-11e7-82f6-3863bb44ef7c',
        capacity: 24,
        short_name: '4452.03',
        lat: 40.68676793,
        electric_bike_surcharge_waiver: false,
        station_type: 'classic',
        eightd_station_services: [],
        has_kiosk: true,
        rental_uris: {
          android: 'https://bkn.lft.to/lastmile_qr_scan',
          ios: 'https://bkn.lft.to/lastmile_qr_scan'
        },
        name: 'Lexington Ave & Classon Ave'
      }
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    启动服务

    要启动该服务,请运行以下命令,

    ./mvnw package
    java -jar ./target/springboot3withdb23c.jar \
      --spring.data.mongodb.uri='mongodb://:@:27017/?authMechanism=PLAIN&authSource=$external&ssl=true&retryWrites=false&loadBalanced=true' \
      --spring.data.mongodb.database=<database_name>
    
    • 1
    • 2
    • 3
    • 4

    测试服务

    你可以使用cURL测试服务。

    # 获取ID为120的station
    curl http://localhost:8181/station/120
    {
      "name" : "Lexington Ave & Classon Ave",
      "region_id" : "71",
      "lon" : -73.95928168,
      "lat" : 40.68676793,
      ...
    
    # 获取station为120的状态数据
    curl http://localhost:8181/status/search/findByStationId?id=120
    "_embedded" : {
      "status" : [ {
        "station_id" : "120",
        "num_bikes_available" : 2,
       ..
    
    # 使用一个事务删除station为120的station和所有相关的状态文件
    curl -i -X DELETE http://localhost:8181/station/120
     HTTP/1.1 200 
     ...
    
    # station 120 已不复存在
    curl -i http://localhost:8181/station/120
     HTTP/1.1 404 
     ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    SQL/JSON

    下面是可以在station和status集合上运行的SQL/JSON的例子。这些查询可以在数据库操作中执行,

    选择JSON文档作为文本。:

    select json_serialize(data)
    from station
    
    • 1
    • 2

    项目字段作为列:

    select 
      s.id,
      s.data.name.string(),
      s.data.region_id.string(),
      s.data.lat.number(),
      s.data.lon.number(),
      s.data.station_type.string()
    from station s;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    按region_id对站点进行分组:

    select
        t.data.region_id.string() as region_id,
        count(*) as count
    from station t
    where t.data.station_type.string() = 'classic'
    group by t.data.region_id.string();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    使用json_dataguide自动创建关系型视图:

    declare
      dg clob;
    begin
    select json_dataguide(data, dbms_json.FORMAT_HIERARCHICAL, dbms_json.pretty) into dg
    from station;
    
    dbms_json.create_view('STATION_VIEW', 'STATION', 'DATA', dg, resolveNameConflicts => true, path => '$._id');
    
    select json_dataguide(data, dbms_json.FORMAT_HIERARCHICAL, dbms_json.pretty) into dg
    from status;
    
    dbms_json.create_view('STATUS_VIEW', 'STATUS', 'DATA', dg);
    end;
    /
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    从创建的视图中选择:

    select * from station_view;
    
    • 1

    在集合之间进行连接:

    select s."station_id" station_id,
           (select t."name" from station_view t where t."_id" = s."station_id") name,
           min(s."num_bikes_available") min,
           max(s."num_bikes_available") max,
           round(avg(s."num_bikes_available")) avg
    from status_view s
    group by s."station_id";
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    create view station_availability as
    select s."station_id" station_id,
           (select t."name" from station_view t where t."_id" = s."station_id") name,
           min(s."num_bikes_available") min,
           max(s."num_bikes_available") max,
           round(avg(s."num_bikes_available")) avg
    from status_view s
    group by s."station_id";
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    选择总是有超过一半的可用容量的station:

    select station_id, name, min, max, avg
    from station_availability
    where min > 20 and avg > 50
    order by max desc;
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    Linux安装mysql
    基于Java的个性化旅游攻略系统设计与实现(源码+lw+ppt+部署文档+视频讲解等)
    会议OA项目-其它页面->自定义组件应用,其它界面的布局
    为什么STM32的HAL库那么难用?
    设计模式学习(二十四):Spring 中使用到的设计模式
    服务器主机管理系统是什么
    绝对不可错过的6个搜索引擎网站,超级值得收藏
    13-Dubbo服务调用过程源码分析-服务消费方发送请求
    数字IC设计中基本运算的粗略的延时估计
    【qt】Qt Creator 设计界面与结果不一致问题
  • 原文地址:https://blog.csdn.net/engchina/article/details/128052933