Причината да получавате тази грешка е, че нямате никакъв предикат в клаузата за филтър. Можете да направите това:
mongos> db.test.update({"messages.id": {$exists: true}}, {$unset: {"messages.$.id":true}}, {multi:true})
И няма да получите грешка - всъщност един от документите ще има id
атрибут премахнат. Проблемът е, че позиционният оператор съвпада само с ПЪРВИЯ елемент от масива, който съответства на вашия предикат, той не съвпада с всички елементи. По-големият проблем е, че в момента не е възможно да се актуализират всички елементи в масив в MongoDB (https ://jira.mongodb.org/browse/SERVER-1243
).
Или ще трябва да преминете през всеки елемент в масива, като използвате числовата позиция ("messages.0.id", "messages.1.id" и т.н.), или можете да изтеглите масива в приложението си, да преминете през елементи и ги актуализирайте и след това запишете масива обратно.
Можете да видите от тикета на JIRA, че този проблем е отворен от известно време, но изглежда 10gen не го смята за много висок приоритет.