なっく日報

技術やら生活やらのメモ

MongoDB v2.6以降は{$set: {}}でupdateするとエラーになる其の二

誰得?な内容ですが、先日の記事の続きがあるので書いておきます。

↓先日の記事はコレ yukidarake.hateblo.jp

↓JIRAのissueはコレ
[SERVER-12266] Update no longer allows empty modifier objects - MongoDB

結構根が深い

既存の処理との互換性を壊さないようにしたいですが、単に$setを取り除くとかやると

db.hoge.update({_id: 'hoge'}, {});

になってオワタ\(^o^)/になるし、findAndModifyのパターンやupsertになっているパターンなどなど影響範囲に含まれるバリエーションも豊富。

力技での対応

対処方法も上記のJIRAになんとなく書いてました。

{$set:{}}への対応

要は、{$set:{_id:'hoge'}}みたいに_idをセットすることで凌げるよう。。

そんなんでいいのか・・・

ちなみに、v2.2やv2.4だと_id$setできないよというエラーが起きる。

{$unset:{}}への対応

{$unset:{___hoge___: 1}}のように絶対に存在しないであろうプロパティを常にセットすると。

いいのかwww

{$inc:{}}とかは?

ここまではさすがに。。。

まとめ

本当は更新内容がなければ、updateすらしないようにするべきなのでしょうが、前述のupsertのときなど、考慮することは多いです。

ただただ辛い。