ざっくり
import自体は正常終了していた事もあり、プログラムばかり疑ってデータを見るのが遅れた。
コマンド実行の際、フィールド定義を同時に行う場合にはスペースに気をつける。
特に白背景のGUIのクライアント使ってるとフィールド名の空白には気付きにくい!(白目
やりたかった事
- mongoimportでCSVから50万件程度のドキュメントを追加したかった。
- CSVには単純にデータのみが入っていて、列定義はコマンド実行時に行う。
ここで困った
- importは無事終了。
- プログラムからドキュメントを取得して、参照している処理がうまく動いていない・・。
- 必要な値が取得出来ていない。でも、DB見るとありそう・・なんで?
原因
例として、CSVの内容はこんな感じ。
1,"abc"
2,"def"
3,"ghi"
で、プログラムではこのCSVの1列目を"no"、2列目を"value"みたいなフィールド名でインポートしたコレクションから、ドキュメント単位で取得して扱う前提。
・・だったのに、実際取得してみると"value"の値が取得出来ない。
プログラムでフィールド名と変数のマッピングが上手く行っていないのかとか迷った挙げ句、importした時のフィールド定義に原因があった。
誤)
mongoimport --host <host> --port <port> --username <user> --password <pass> --db <dbname> --collection <SAMPLE_COLLECTION> --type csv --columnsHaveTypes --fields "no.int64(), value.string()" --file sample.csv
正)
mongoimport --host <host> --port <port> --username <user> --password <pass> --db <dbname> --collection <SAMPLE_COLLECTION> --type csv --columnsHaveTypes --fields "no.int64(),value.string()" --file sample.csv
どちらもインポート自体は上手く行くんですが、誤っている方のコマンドで生成されるフィールド名はそれぞれ"no"と" value"です。
"value"を期待してるのに" value"じゃそりゃ無理ですよね。
一部フィールドの値が入っていないのかと$existした時に結果がおかしかったので気づけました。
(白背景のGUIクライアントで見ていると気づきにくい・・。)
以上、「カンマの後にはスペース一個」が癖になっていた事が招いた悲劇でした・・。