MongoDBへCSVインポートするときフィールドの型を指定するには

mongoimportでcsvファイルをインポートする時。

csvの数字を例えば”1234″のように”(ダブルクォート)で囲っても、文字列として取り込まれずに、Numberへ変換されてしまうようです。

むむむ。

フィールドごとに型を指定してインポートする方法を記録しておこうと思います。


CSVを作る際の注意点

1. 列ごとの型の指定

csvファイルを作る時、1行目のヘッダに、型を書いておくと良さそうです。

この例では、1列目をdate.string()、2列目をcode.string()のようにフィールド名と同時にstring型を指定しています。

使用できる型は、mongoimportドキュメントの–columnsHaveTypes欄に記載されています。

autoが既定値かと思いますが、stringやdouble等、使いたい型を選択して指定すれば良いようです。

2. 余計な空白の除去

CSVを作る段階で、空白のトリムも行っておいた方が良さそうです。

3. UTF-8に変換

CSVの文字コードはUTF-8に変換しておきます。

4. 日時の取り扱い

mongodbへ日時(時刻)をインポートすると、UTCとして入力されたものとして扱われるようです。

日時のタイムゾーンを指定したい場合、ISODateヘルパーで指定できますが

ISODate("2018-01-02T12:34:56+09:00")

タイムゾーン付きで日時が保存されるのではなく、インポート時にUTCに変換されて保存されるようです。

日時で検索を行いたい場合、検索条件にISODateヘルパーを使った形式で指定すれば、UTCで保存されていても正しい検索が可能ですが、記述方法・処理ともにオーバーヘッドが少し発生してしまいます。

日時をタイムスタンプとして扱わず、分解して日付(のみ)・時刻(のみ)で保存したほうが良い場合もありそうです。


mongoimportの取り込みオプション

次のようなオプションを使用しました。

mongoimport --username=<ユーザ名> --db=<データベース名> --collection <インポート先のコレクション名> --type csv --file <csvファイルパス> --headerline --columnsHaveTypes

–headerlineオプションと–columnsHaveTypesオプションを有効にすることで、CSVの1行目に記載したフィールド名と型が有効になるようです。


新たにデータベースを作る場合の覚書

mongo admin -u root -p

mongoコマンドでmongoDB shellを起動。

// test1データベースを作る場合
use test1
// ユーザ作成
db.createUser({user:"<ユーサ名>",pwd:"<パスワード>",roles:[{"role":"root","db":"admin"}]})
// 何かドキュメントを入れると、データベースが表示されるようです
db.testcol.insert({"name":"test1"})
show dbs

何かドキュメントを入れるとshow dbsに反映されて、Mongo Express等から見えるようになるようです。

スポンサーリンク

フォローする

スポンサーリンク