Node.js/Mongooseでmixed typeな連想配列が正しく保存されない….

設計に問題あるんだろうけど以下のようにmixed typeの一部を更新しようとしても変わらない問題に当たったのでメモ.

以下を読むと書いてある

https://mongoosejs.com/docs/schematypes.html#mixed
https://stackoverflow.com/questions/31154258/how-to-update-mixed-type-field-in-mongoose-without-overwriting-the-current-data

上のStackoverflowとドキュメントによれば、mixed typeではmongooseが自動で更新を見つけられないので、ちゃんと教えてやる必要がある.

その方法は

person.anything = { x: [3, 4, { y: “changed” }] };
person.markModified(‘anything’);   //これ!!!!!
person.save();

知らんかった…

 

 

 

以下は適当な方法なので読まなくていいです.

modelの定義

sample:{type:mongoose.Schema.Types.Mixed}

コード

a.sample[“a”][“b”][“c”] = 10  ;
a.save(function(err, _a){});   //次に読みだした時に更新されていない…

Saveで困ったことなかったのだけど、どうもこれは、辞書のアドレスが変わっていないことで更新保存が不要と判断されたみたい?正しく追っていないので全く根拠ないですが…

コード

var updateA = JSON.parse(JSON.stringify(a.sample)); //DeepCopy
updateA[“a”][“b”][“c”] = 10;
a.sample = updateA;
a.save(function(err,_a){}); //次に読みだし時に更新されてる

一方で連想配列(Dict)ではなく配列(Array)の場合は、pushを使った更新によって適切に更新されて保存されるみたい…

 

About the author

コメントを残す