$set operatore viene utilizzato su upsert anche. Quindi non ha senso fare riferimento agli stessi campi entrambi su $set e $setOnInsert .
Provalo su una raccolta vuota:
db.items.remove();
db.items.update({},{$set:{a:1},$setOnInsert:{b:2}},{upsert:1})
db.items.find({});