MongoDBとRDBはそもそもの思想が異なるので、RDBに持っているレコードをそのままMongoDBに移すというパターンは稀で、本来はDocumentDBらしいスキーマ構成などを考えるべきだとは思います。
しかし、RDBからMongoDBへの以降などを検討している状態で、「RDBに入ってるデータを全てMongoDBに移したら、データ量的にちゃんとさばけるんだろうか」「一旦テストデータとして、RDBのデータを使ってみたい」というニーズが出てきたので、私と同じような境遇にある方に向けて、この記事を送ります。
方法としては以下の通り
- RDBからSelectした結果をjsonファイルで取り出す(この時にユニークキーを基にIDを生成)
- JSONファイルをMongoDBのinsert文に変換
- MongoDBに流す
RDBからSelectした結果をjsonファイルで取り出す
今回は以下の従業員リストを想定して行ってみます
-
テーブル名 : employeeList
- 事業所ID : officeId(主キー)
- 従業員ID : employeeId(主キー)
- 苗字 : lastName
- 名前 : firstName
- 性別 : sex
- 年齢 : age
以下のコマンドで、employeeListから全レコードをJSONで取り出します。
-- 取得結果を書き込むファイルを宣言
\o employee_list.json
-- 全件取得結果をJSONで取り出す
WITH trimedEmployeeList AS (
SELECT
officeId || '_' || employeeId AS "_id",
*
FROM employeeList
)
SELECT to_json(trimedEmployeeList) from trimedEmployeeList;
-- 終了
\q
この時に、RDBの主キーを文字列結合で繋げて、MongoDBのidにしています。
idを指定しなければ、MongoDB側でユニークなオブジェクトIDが発行されるので、なくても大丈夫です。
JSONファイルをMongoDBのinsert文に変換
JSONファイルが吐き出されたら、中身をMongoDBのinsert文にうまいこと加工します。
主にやったことは以下の通りです。
- RDBのカラム名削除
- カラムとレコードの境の線削除
- JSONの最後の}を},に変換(コンマを付けた)
- JSONを以下で囲む
db.employeeList.insertMany([ ここにJSON ])
employeeListの部分はMongoDBのコレクション名にあたるので、お好みで変更ください。
MongoDBに流す
上記で作成したMongoDBのinsert文をCLIで流したら完成!
皆が慣れ親しんだ、RDBのレコードをMongoDBに入れるとこうなるよ!みたいなモックとしてもご利用いただけるかと思います。
改めてですが、本当にMongoDBを使うとなった時には、改めてスキーマ設計をしましょうね。