Lý do bạn nhận được lỗi đó là vì bạn không có bất kỳ vị từ nào trong mệnh đề bộ lọc. Bạn có thể làm điều này:
mongos> db.test.update({"messages.id": {$exists: true}}, {$unset: {"messages.$.id":true}}, {multi:true})
Và bạn sẽ không gặp lỗi - trên thực tế, một trong các tài liệu sẽ có id
đã xóa thuộc tính. Vấn đề là toán tử vị trí chỉ khớp với phần tử ĐẦU TIÊN của mảng khớp với vị từ của bạn, nó không khớp với tất cả các phần tử. Vấn đề lớn hơn là hiện không thể cập nhật tất cả các phần tử trong một mảng trong MongoDB ( https ://jira.mongodb.org/browse/SERVER-1243
).
Bạn sẽ cần phải lặp lại từng phần tử trong mảng bằng cách sử dụng vị trí số ("messages.0.id", "messages.1.id", v.v.) hoặc bạn có thể kéo mảng vào ứng dụng của mình, lặp qua và cập nhật chúng, sau đó lưu mảng trở lại.
Bạn có thể thấy từ vé JIRA rằng vấn đề này đã được mở khá lâu nhưng 10gen dường như không coi nó là mức độ ưu tiên cao.