$establecer el operador se usa en upsert también. Por lo tanto, no tiene sentido hacer referencia a los mismos campos en $set y $setOnInsert .
Prueba esto en una colección vacía:
db.items.remove();
db.items.update({},{$set:{a:1},$setOnInsert:{b:2}},{upsert:1})
db.items.find({});