既存の mongodb ドキュメントで _id を更新できないという事実を理解しています。
しかし、「setOnInsert」部分のアップサートで使用できない理由はありますか? 「挿入時」であるため、更新ではありません。
私の予想される使用法は次のとおりです。
db.myCol.update({_id:12345},{$setOnInsert:{_id:12345},$set:{myValue:'hi'}});
これはバグですか、それとも何か不足していますか?
既存の mongodb ドキュメントで _id を更新できないという事実を理解しています。
しかし、「setOnInsert」部分のアップサートで使用できない理由はありますか? 「挿入時」であるため、更新ではありません。
私の予想される使用法は次のとおりです。
db.myCol.update({_id:12345},{$setOnInsert:{_id:12345},$set:{myValue:'hi'}});
これはバグですか、それとも何か不足していますか?
MongoDB は、アップサート クエリの「クエリ」部分をセットの一部として使用します。つまり、独自の _id を指定したいのセット部分で _id を指定する必要はありません。
注: 上記のクエリには、upsert フラグの欠落という小さなバグもありました。
これは正しいクエリです。
db.myCol.update({_id:12345},{$set:{myValue:'hi'}},{upsert:true});
レコードが存在しない場合、このクエリは次のようなレコードを挿入します。
{_id:12345,myValue:'hi'}
実際、これは開発バージョン 2.5.4 またはリリース 2.6.0 で修正された mongo のバグです。
https://jira.mongodb.org/browse/SERVER-9958
それが修正されたら、これは希望どおりに機能するはずです。一般的なケースでは、更新のクエリは必ずしも「_id」フィールドを指定するとは限りません。