はじめに
オークファンでは一部で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から取得する場合は文字列として取得されるので、文字列をデシリアライズする
実は小数の計算はもっとややこしかったりします。。。興味のある方は( ̄ー ̄)ニヤリ