Det er ikke en fiasko, men ved design.
Under Bulk Operations API , hvis du angiver en værdi til opdatering, der matcher en eksisterende værdi af dokumentet, markeres den ikke som ændret og gør faktisk ikke noget forsøg på at omskrive dokumentet.
Simpel test:
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 })
Alle operationer i MongoDB-skallen fra version 2.6 bruger faktisk Bulk Operations API . Det er her du ser WriteResult
som kommer fra den API som bevis på, at dette sker.
Så det korte tilfælde her er, hvis du har "manuelt indsat" elementer, der er af den korrekte type, du ændrer til, så bliver de ikke ændret.