久々に超初歩的なミスをやってしまいました....
ドキュメント指向データベースのMongoDBはJSON(BJSON)のドキュメントをそのまま格納できます。
> db.col.save({ _id:123, text:'hoge', lat:35, lon:139 }); > db.col.save({ _id:456, text:'piyo', lat:36, lon:141 });
こんな感じでそのまま入っている。
> db.col.find(); { "_id" : 123, "text" : "hoge", "lat" : 35, "lon" : 139 } { "_id" : 456, "text" : "piyo", "lat" : 36, "lon" : 141 }
ここで特定のカラムのみを書き換えたい場合はupdateコマンドと$setオペレータを使います。
> db.col.update({_id:456}, {$set:{text:'aho'}}, { multi: false, upsert: false });
こうすればちゃんと変更される。
> db.col.find(); { "_id" : 123, "text" : "hoge", "lat" : 35, "lon" : 139 } { "_id" : 456, "text" : "aho", "lat" : 36, "lon" : 141 }
しかし!この$setを省略してしまうと....
> db.col.update({_id:456}, {text:'aho'}, { multi: false, upsert: false }); > db.col.find(); { "_id" : 123, "text" : "hoge", "lat" : 35, "lon" : 139 } { "_id" : 456, "text" : "aho" }
これは結果的に _id:456の指し示すドキュメントをtext:'aho'に置き換えた ということ。 だからデータが消える...この操作を580万件中7万件に適用して、データを欠けさせたのが、私です(死)。