Help us understand the problem. What is going on with this article?

ArangoDBとJavaのデータマッピングを調べてみた

はじめに

オークファンでは一部でArangoDBを使用しています。
ArangoDBとは、DocumentDBとGraphDBのいいとこ取りした、ハイブリッドなNoSQLのデータベースです。

*DocumentDBやGraphDBがなんぞやというのは置いておきます。

オークファンでは、商品の情報や販売情報などのデータを活用したサービスづくりをしています。

私が所属しているチームでは、商品ごとに異なる性質の情報(スペックなど)や、メーカーやカテゴリーといったデータの関連を考慮したデータを扱いたい場合に、ArangoDBのようなデータベースが適していると考え、使用しています。

一方で、それらのデータを参照したり集計したりするソフトウェアを作成する場合には、JavaもしくはKotlinを採用しています。
そのためArangoDBに対してプログラムからアクセスする場合には、ArangoDBから提供されているJavaAPIを介して行います。

ArangoDBはJavaではないです。扱うデータは基本的にJSONの形式となります。
当然ですがデータ型の定義はプログラムと異なることになります。

Javaで自然に使用しているデータ型がArangoDBに入れた場合に、ArangoDBが扱える型(JSONの形式)に変わってしまい、データ利用時に意図しない型変換に悩まされないよう、テストしてみました。

前提

各種バージョンについては下記のとおりです。

  • Java:11
  • ArangoDB:3.4.1

Java → ArangoDB

ArangoDBへ格納は、BaseDocumentクラスを使用し、addAttribute()メソッドでデータをセットします。

格納したデータをArangoDBのWebUIで確認し格納された状態を確認します。

Javaの型 →ArangoDBの型 備考
int 数値(整数)
Integer 数値(整数)
long 数値(整数)
Long 数値(整数)
float 数値(小数) ※ データが崩れた
Float 数値(小数) ※ データが崩れた
double 数値(小数)
Double 数値(小数)
BigDecimal 文字列
boolean 真偽値(true/false)
Boolean 真偽値(true/false)
LocalDate 文字列 ISO8601形式
LocalDateTime 文字列 ISO8601形式
OffsetDateTime 文字列 ISO8601形式
ZonedDateTime 文字列 ISO8601(拡張)形式
List 配列
Map オブジェクト オブジェクト内の型は上記マッピングと同様

ArangoDB → Java

ArangoDBにWebUIからデータを格納し、Javaで取得したときのデータ型は下記のようになりました。

ArangoDBの型 →Javaの型 備考
文字列 String
数値(整数) Long
数値(小数) Double
真偽値(true/false) Boolean
配列 ArrayList 中の型は他と同様
オブジェクト HashMap 中の型は他と同様

Java → ArangoDB → Java

JavaでArangoDBに格納したデータを、Javaで取得したときのデータ型の変化の流れは下記のようになりました。

Javaの型 →ArangoDBの型 →Javaの型 備考
int 数値(整数) Long
Integer 数値(整数) Long
long 数値(整数) Long
Long 数値(整数) Long
float 数値(小数) Double ※ データが崩れた
Float 数値(小数) Double ※ データが崩れた
double 数値(小数) Double
Double 数値(小数) Double
BigDecimal 文字列 String
boolean 真偽値(true/false) Boolean
Boolean 真偽値(true/false) Boolean
LocalDate 文字列 String ISO8601形式
LocalDateTime 文字列 String ISO8601形式
OffsetDateTime 文字列 String ISO8601形式
ZonedDateTime 文字列 String ISO8601(拡張)形式
List 配列 ArrayList 中の型は他と同様
Map オブジェクト HashMap オブジェクト内の型は上記マッピングと同様

まとめ

JavaAPIでArangoDBを使う場合は、ちょっと注意が必要だと分かりました。

気にせず使えるのは

  • 整数はLong型
  • 小数はDouble型
  • 真偽値はBoolean型
  • ListやMapのコレクションクラス

ちょっと拡張したくなるのは

  • BigDecimalで扱いたい場合
    • ArangoDBに入れる場合には文字列にシリアライズされる
    • ArangoDBから取得する場合は文字列として取得されるので、文字列をデシリアライズする
  • Java8以降のDateTimeAPIを使用する場合
    • ArangoDBに入れる際は文字列にシリアライズされる
    • ArangoDBから取得する場合は文字列として取得されるので、文字列をデシリアライズする

実は小数の計算はもっとややこしかったりします。。。興味のある方は( ̄ー ̄)ニヤリ

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした