3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

オークファングループAdvent Calendar 2019

Day 7

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

Last updated at Posted at 2019-12-06

はじめに

オークファンでは一部で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から取得する場合は文字列として取得されるので、文字列をデシリアライズする

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

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?