$set -Operator wird beim Upsert verwendet zu. Es ist also unsinnig, dieselben Felder auf $set zu verweisen und $setOnInsert .
Probieren Sie es einfach mit einer leeren Sammlung aus:
db.items.remove();
db.items.update({},{$set:{a:1},$setOnInsert:{b:2}},{upsert:1})
db.items.find({});