Não é uma falha, mas por design.
Na API de operações em massa , se você fornecer um valor para atualização que corresponda a um valor existente do documento, ele não será marcado como modificado e, na verdade, não fará nenhuma tentativa de reescrever o documento.
Teste simples:
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 })
Todas as operações no shell do MongoDB a partir da versão 2.6 estão realmente usando a API de operações em massa . É aqui que você vê o
WriteResult
que vem dessa API como prova de que isso está acontecendo. Portanto, o caso curto aqui é se você tiver itens "inseridos manualmente" que são do tipo correto para o qual você está modificando, eles não serão alterados.