Det är inte ett misslyckande utan genom design.
Under Bulk Operations API , om du anger ett värde att uppdatera som matchar ett befintligt värde i dokumentet så markeras det inte som modifierat och gör faktiskt inga försök att skriva om dokumentet.
Enkelt 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 })
Alla operationer i MongoDB-skalet från och med version 2.6 använder faktiskt Bulk Operations API . Det är här du ser WriteResult
som kommer från det API:et som bevis på att detta händer.
Så det korta fallet här är att om du har "manuellt infogat" objekt som är av rätt typ som du ändrar till, så ändras de inte.