I found exactly the code responsible for the bug.
in migration.py
doc.collection.update(self.target, self.update, multi=False, safe=safe)
# reload
try:
doc.update(doc.collection.get_from_id(doc['_id']))
except:
raise OperationFailure('Can not reload an unsaved document. '
'%s is not found in the database' % doc['_id'])
The local document is updated with update and therefore removed fields just stay inside the document and cause the same exception for an extra field