No hay razón para mostrar un error de índice duplicado en el primer caso, ya que solo está tratando de actualizar el _id
y name
campos del mismo registro con el mismo valor.
Si lo intentas
db.foo.update({ _id: '1098'}, { _id: 'doe123', name: 'John Doe'}, { upsert: true});
obtendrá un error, ya que la consulta está intentando actualizar el registro con diferentes _id
con algunos _id
existentes valor.
En el segundo caso, creó un registro primero con name
y luego está intentando actualizar el mismo nombre en otro registro, lo que dará un error como name
es un índice único.
Editar:-
Si lo estás intentando
db.foo.insert({ _id: 'doe123', name: 'John Doe'});
le dará el error, ya que en este caso está intentando insertar un registro que ya está presente, es decir, _id
es único y está intentando crear un registro más con el mismo _id
valor.