Alasan Anda mendapatkan kesalahan itu adalah karena Anda tidak memiliki predikat dalam klausa filter. Anda dapat melakukan ini:
mongos> db.test.update({"messages.id": {$exists: true}}, {$unset: {"messages.$.id":true}}, {multi:true})
Dan Anda tidak akan mendapatkan kesalahan - sebenarnya salah satu dokumen akan memiliki id
atribut dihapus. Masalahnya adalah bahwa operator posisi hanya cocok dengan elemen PERTAMA dari array yang cocok dengan predikat Anda, tidak cocok dengan semua elemen. Masalah yang lebih besar adalah saat ini tidak mungkin untuk memperbarui semua elemen dalam array di MongoDB (https ://jira.mongodb.org/browse/SERVER-1243
).
Anda harus mengulangi setiap elemen dalam larik menggunakan posisi numerik ("messages.0.id", "messages.1.id", dll.) atau Anda dapat menarik larik ke dalam aplikasi Anda, loop melalui elemen dan memperbaruinya, lalu menyimpan array kembali.
Anda dapat melihat dari tiket JIRA bahwa masalah ini telah dibuka cukup lama tetapi 10gen tampaknya tidak menganggapnya sebagai prioritas yang sangat tinggi.