Đó không phải là một thất bại mà là do thiết kế.
Trong API hoạt động hàng loạt , nếu bạn cung cấp một giá trị để cập nhật khớp với giá trị hiện có của tài liệu thì nó không được đánh dấu là đã sửa đổi và thực sự không thực hiện bất kỳ nỗ lực nào để viết lại tài liệu.
Kiểm tra đơn giản:
db.junk.insert({ "a": 1 })
WriteResult({ "nInserted" : 1 })
db.junk.update({ "a": 1},{ "$set": { "a": 2 }})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
db.junk.update({ "a": 2 },{ "$set": { "a": 2 }})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
db.junk.update({ "a": 2 },{ "$set": { "a": NumberInt(2) }})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
db.junk.update({ },{ "$set": { "a": NumberInt(2) }})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
Tất cả các hoạt động trong MongoDB shell kể từ phiên bản 2.6 đang thực sự sử dụng API hoạt động hàng loạt . Đây là nơi bạn thấy WriteResult
xuất phát từ API đó như một bằng chứng điều này đang xảy ra.
Vì vậy, trường hợp ngắn gọn ở đây là nếu bạn có các mục "được chèn theo cách thủ công" thuộc đúng loại mà bạn đang sửa đổi, thì chúng sẽ không bị thay đổi.