Není to selhání, ale design.
V rámci rozhraní API pro hromadné operace , pokud zadáte hodnotu k aktualizaci, která odpovídá existující hodnotě dokumentu, nebude označena jako upravená a ve skutečnosti se nepokusí dokument přepsat.
Jednoduchý 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 })
Všechny operace v prostředí MongoDB od verze 2.6 ve skutečnosti používají Hromadné operace API . Zde vidíte WriteResult
který pochází z tohoto API jako důkaz, že se to děje.
Zkrácený případ tedy je, že pokud jste „ručně vložili“ položky správného typu, na který upravujete, nezmění se.