設計に問題あるんだろうけど以下のように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を使った更新によって適切に更新されて保存されるみたい…