To nie porażka, ale projekt.
W Interfejs API operacji zbiorczych , jeśli podasz wartość do aktualizacji, która odpowiada istniejącej wartości dokumentu, nie zostanie ona oznaczona jako zmodyfikowana i faktycznie nie podejmie żadnej próby przepisania dokumentu.
Prosty 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 })
Wszystkie operacje w powłoce MongoDB od wersji 2.6 w rzeczywistości korzystają z Interfejsu API operacji zbiorczych . Tutaj zobaczysz WriteResult
który pochodzi z tego interfejsu API jako dowód, że tak się dzieje.
Tak więc krótki przypadek polega na tym, że jeśli masz "ręcznie wstawione" elementy, które są właściwego typu, do którego modyfikujesz, to nie zostaną one zmienione.