Ini bukan kegagalan tetapi dengan desain.
Di bawah API Operasi Massal , jika Anda memberikan nilai untuk memperbarui yang cocok dengan nilai dokumen yang ada, maka itu tidak ditandai sebagai diubah dan sebenarnya tidak melakukan upaya apa pun untuk menulis ulang dokumen.
Tes sederhana:
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 })
Semua operasi di shell MongoDB pada versi 2.6 sebenarnya menggunakan API Operasi Massal . Di sinilah Anda melihat WriteResult
yang berasal dari API itu sebagai bukti bahwa ini terjadi.
Jadi kasus singkatnya di sini adalah jika Anda memiliki item yang "dimasukkan secara manual" dengan tipe yang benar yang Anda modifikasi, maka item tersebut tidak akan diubah.