Es ist kein Fehler, sondern beabsichtigt.
Unter der Bulk Operations API , wenn Sie einen zu aktualisierenden Wert angeben, der mit einem vorhandenen Wert des Dokuments übereinstimmt, wird er nicht als geändert markiert und versucht tatsächlich nicht, das Dokument neu zu schreiben.
Einfacher 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 Operationen in der MongoDB-Shell ab Version 2.6 verwenden tatsächlich die Bulk Operations API . Hier sehen Sie das WriteResult
was von dieser API als Beweis dafür kommt.
Der kurze Fall hier ist also, wenn Sie "manuell eingefügte" Elemente haben, die den richtigen Typ haben, den Sie ändern, dann werden sie nicht geändert.