このエラーが発生する理由は、filter句に述語がないためです。これを行うことができます:
mongos> db.test.update({"messages.id": {$exists: true}}, {$unset: {"messages.$.id":true}}, {multi:true})
また、エラーは発生しません。実際、ドキュメントの1つにid
が含まれています。 属性が削除されました。問題は、位置演算子が述語に一致する配列の最初の要素にのみ一致し、すべての要素に一致するわけではないことです。より大きな問題は、現在、MongoDBの配列内のすべての要素を更新できないことです( https ://jira.mongodb.org/browse/SERVER-1243
。
数値位置( "messages.0.id"、 "messages.1.id"など)を使用して配列内の各要素を反復処理する必要があります。または、配列をアプリケーションにプルして、ループすることができます。要素を更新してから、配列を保存して戻します。
JIRAチケットから、この問題はかなり前から公開されていることがわかりますが、10genはそれをそれほど優先度が高いとは考えていないようです。