Ce n'est pas un échec mais par conception.
Sous API d'opérations en masse , si vous fournissez une valeur à mettre à jour qui correspond à une valeur existante du document, elle n'est pas marquée comme modifiée et n'effectue aucune tentative de réécriture du document.
Essai simplifié :
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 })
Toutes les opérations dans le shell MongoDB à partir de la version 2.6 utilisent en fait l'l'API des opérations en bloc . C'est là que vous voyez le WriteResult
qui vient de cette API comme preuve que cela se produit.
Donc, le cas court ici est que si vous avez des éléments "insérés manuellement" qui sont du bon type que vous modifiez, alors ils ne seront pas modifiés.