Het is geen mislukking, maar door het ontwerp.
Onder de Bulk Operations API , als u een bij te werken waarde opgeeft die overeenkomt met een bestaande waarde van het document, wordt deze niet gemarkeerd als gewijzigd en wordt er feitelijk geen poging gedaan om het document opnieuw te schrijven.
Eenvoudige 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 bewerkingen in de MongoDB-shell vanaf versie 2.6 gebruiken feitelijk de Bulk Operations API . Hier zie je de WriteResult
die van die API komt als bewijs dat dit gebeurt.
Dus het korte geval hier is dat als je "handmatig ingevoegde" items hebt die van het juiste type zijn waarnaar je aan het wijzigen bent, ze niet worden gewijzigd.