$set операторът се използва при upsert също. Така че е глупост да се препращат едни и същи полета към $set и $setOnInsert .
Просто опитайте това в празна колекция:
db.items.remove();
db.items.update({},{$set:{a:1},$setOnInsert:{b:2}},{upsert:1})
db.items.find({});