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等から見えるようになるようです。