TL; DR:$inc
гарантира актуализации на място, $set
не, но при много специфични обстоятелства може да се направи и на място.
Подробности
Това има два аспекта:
-
как минава през кабела?
Информацията се изпраща като операция,
$set
остава$set
така че е делта. Това важи и за oplog, който се използва за репликация. По този начин, използвайки$set
е по-ефективен по отношение на честотната лента. -
как се актуализира на диск?
MongoDB извършва актуализация на място ако и само ако ключът (полето) вече съществува , така че когато добавите ново поле към документ, това е по-голяма операция от простото присвояване на различна стойност на съществуващо поле.
Дори тогава обаче стойностите трябва да имат еднакъв размер и не трябва да не променя типа и те трябва да са от тип
double, long, int or bool
, в противен случай не актуализация на място в момента.
Не съм сигурен как последното е наистина важно на практика , но сървърът определено използва напълно различни кодови пътища за двете, така че може например да доведе до пренареждане на полета. За много големи документи това вероятно ще доведе до измерима разлика в производителността.
Това показва, че $inc
е много различен по това, че позволява само операции, които със сигурност са на място, защото $inc
работи само с числови типове и не може да променя размера или типа, естествено.