$set operator wordt gebruikt op upsert te. Het is dus onzin om zowel op $set . naar dezelfde velden te verwijzen en $setOnInsert .
Probeer dit maar eens op een lege verzameling:
db.items.remove();
db.items.update({},{$set:{a:1},$setOnInsert:{b:2}},{upsert:1})
db.items.find({});