La raison pour laquelle vous obtenez cette erreur est que vous n'avez aucun prédicat dans la clause de filtre. Vous pouvez faire ceci :
mongos> db.test.update({"messages.id": {$exists: true}}, {$unset: {"messages.$.id":true}}, {multi:true})
Et vous n'obtiendrez pas d'erreur - en fait, l'un des documents aura l'id
attribut supprimé. Le problème est que l'opérateur de position ne correspond qu'au PREMIER élément du tableau qui correspond à votre prédicat, il ne correspond pas à tous les éléments. Le plus gros problème est qu'il n'est actuellement pas possible de mettre à jour tous les éléments d'un tableau dans MongoDB (https ://jira.mongodb.org/browse/SERVER-1243
).
Vous devrez soit parcourir chaque élément du tableau en utilisant la position numérique ("messages.0.id", "messages.1.id", etc.) ou vous pouvez insérer le tableau dans votre application, parcourir le éléments et mettez-les à jour, puis enregistrez le tableau.
Vous pouvez voir sur le ticket JIRA que ce problème est ouvert depuis un certain temps, mais 10gen ne semble pas le considérer comme une priorité très élevée.