Non è un fallimento ma di progettazione.
Sotto l'API per le operazioni in blocco , se fornisci un valore da aggiornare che corrisponda a un valore esistente del documento, questo non viene contrassegnato come modificato e in realtà non esegue alcun tentativo di riscrivere il documento.
Prova semplice:
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 })
Tutte le operazioni nella shell MongoDB a partire dalla versione 2.6 utilizzano in realtà l'API per operazioni in blocco . Qui è dove puoi vedere WriteResult
che proviene da quell'API come prova che ciò sta accadendo.
Quindi il caso breve qui è se hai elementi "inseriti manualmente" che sono del tipo corretto su cui stai modificando, allora non vengono modificati.