Anledningen till att du får det felet är att du inte har något predikat i filtersatsen. Du kan göra så här:
mongos> db.test.update({"messages.id": {$exists: true}}, {$unset: {"messages.$.id":true}}, {multi:true})
Och du kommer inte att få ett felmeddelande - i själva verket kommer ett av dokumenten att ha id
attribut borttaget. Problemet är att positionsoperatorn bara matchar det FÖRSTA elementet i arrayen som matchar ditt predikat, den matchar inte alla element. Det större problemet är att det för närvarande inte är möjligt att uppdatera alla element i en array i MongoDB (https ://jira.mongodb.org/browse/SERVER-1243
).
Du måste antingen iterera genom varje element i arrayen med den numeriska positionen ("messages.0.id", "messages.1.id", etc.) eller så kan du dra arrayen in i din applikation, gå igenom element och uppdatera dem och spara sedan arrayen igen.
Du kan se på JIRA-biljetten att det här numret har varit öppet ett bra tag men 10gen verkar inte anse det som särskilt hög prioritet.