Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mongodb - duplicate fields in $set and $setOnInsert

Tags:

mongodb

upsert

In this post, the accepted answer explains that you cannot have the same fields under $set and $setOnInsert in an upsert operation.

Can someone explain why this is? It seems like the $setOnInsert shouldn't conflict with $set, since the former is used when a document is inserted, and the latter is used when the document is updated.

like image 543
jtmarmon Avatar asked Dec 18 '14 17:12

jtmarmon


2 Answers

I faced this problem. If someone is looking for a solution, you need to understand how the $set and $setOnInsert mechanism works $set refreshes if found (ignoring $setOnInsert) $setOnInsert inserts a new record (and then executes $set) I did not know this and thought that only one operator would work. This way I was able to get rid of duplicate fields

like image 69
Александр Артюх Avatar answered Oct 12 '22 00:10

Александр Артюх


$set operator is used on upsert too. So it's nonsense to refer same fields both on $set and $setOnInsert.

Just try this on an empty collection:

db.items.remove();
db.items.update({},{$set:{a:1},$setOnInsert:{b:2}},{upsert:1})
db.items.find({});
like image 37
hemme Avatar answered Oct 12 '22 01:10

hemme