$set operador é usado em upsert também. Portanto, não faz sentido referir os mesmos campos em $set e $setOnInsert .
Apenas tente isso em uma coleção vazia:
db.items.remove();
db.items.update({},{$set:{a:1},$setOnInsert:{b:2}},{upsert:1})
db.items.find({});