Důvod, proč se vám zobrazuje tato chyba, je ten, že v klauzuli filtru nemáte žádný predikát. Můžete to udělat:
mongos> db.test.update({"messages.id": {$exists: true}}, {$unset: {"messages.$.id":true}}, {multi:true})
A nedojde k chybě – ve skutečnosti bude mít jeden z dokumentů id
atribut odstraněn. Problém je v tom, že poziční operátor odpovídá pouze PRVNÍMU prvku pole, který odpovídá vašemu predikátu, neodpovídá všem prvkům. Větším problémem je, že v současné době není možné aktualizovat všechny prvky v poli v MongoDB (https ://jira.mongodb.org/browse/SERVER-1243
).
Buď budete muset iterovat každý prvek v poli pomocí číselné pozice ("messages.0.id", "messages.1.id" atd.), nebo můžete pole stáhnout do své aplikace a procházet prvky a aktualizujte je a poté pole uložte zpět.
Z lístku JIRA můžete vidět, že tento problém je již nějakou dobu otevřený, ale 10gen to zřejmě nepovažuje za příliš vysokou prioritu.