Grunden til at du får den fejl, er fordi du ikke har noget prædikat i filterklausulen. Du kan gøre dette:
mongos> db.test.update({"messages.id": {$exists: true}}, {$unset: {"messages.$.id":true}}, {multi:true})
Og du får ingen fejl - faktisk vil et af dokumenterne have id
attribut fjernet. Problemet er, at positionsoperatoren kun matcher det FØRSTE element i arrayet, der matcher dit prædikat, det matcher ikke alle elementer. Det større problem er, at det i øjeblikket ikke er muligt at opdatere alle elementerne i et array i MongoDB (https ://jira.mongodb.org/browse/SERVER-1243
).
Du bliver enten nødt til at gentage hvert element i arrayet ved hjælp af den numeriske position ("messages.0.id", "messages.1.id", osv.), eller du kan trække arrayet ind i din applikation, sløjfe gennem elementer og opdater dem, og gem derefter arrayet igen.
Du kan se på JIRA-billetten, at dette nummer har været åbent i et stykke tid, men 10gen ser ikke ud til at have særlig høj prioritet.