Powodem, dla którego otrzymujesz ten błąd, jest brak predykatu w klauzuli filtra. Możesz to zrobić:
mongos> db.test.update({"messages.id": {$exists: true}}, {$unset: {"messages.$.id":true}}, {multi:true})
I nie dostaniesz błędu - w rzeczywistości jeden z dokumentów będzie miał id
atrybut usunięty. Problem polega na tym, że operator pozycyjny pasuje tylko do PIERWSZEGO elementu tablicy, który pasuje do twojego predykatu, nie pasuje do wszystkich elementów. Większym problemem jest to, że obecnie nie jest możliwe aktualizowanie wszystkich elementów tablicy w MongoDB (https ://jira.mongodb.org/browse/SERVER-1243
).
Będziesz musiał przejść przez każdy element w tablicy, używając pozycji numerycznej ("messages.0.id", "messages.1.id" itp.) lub możesz przeciągnąć tablicę do swojej aplikacji, wykonując pętlę przez elementy i zaktualizuj je, a następnie zapisz tablicę z powrotem.
Na zgłoszeniu JIRA widać, że ten problem jest otwarty od dłuższego czasu, ale 10gen nie wydaje się uważać go za bardzo wysoki priorytet.