TL;DR:$inc
garandeert interne updates, $set
niet, maar onder zeer specifieke omstandigheden kan het ook ter plaatse worden gedaan.
Details
Dit heeft twee aspecten:
-
hoe gaat het over de draad?
De informatie wordt verzonden als een bewerking, een
$set
blijft een$set
dus het is een delta. Dat geldt ook voor de oplog die voor replicatie wordt gebruikt. Op deze manier, met behulp van$set
is efficiënter met betrekking tot bandbreedte. -
hoe wordt het bijgewerkt op schijf?
MongoDB voert een in-place update uit als en alleen als de sleutel (veld) al bestaat , dus wanneer u een nieuw veld aan een document toevoegt, is dat een grotere operatie dan alleen het toewijzen van een andere waarde aan een bestaand veld.
Maar zelfs dan moeten de waarden dezelfde grootte . hebben en mag niet van type veranderen en ze moeten van het type zijn
double, long, int or bool
, anders is het niet momenteel een interne update.
Ik weet niet zeker hoe dat laatste echt belangrijk is in de praktijk , maar de server gebruikt absoluut totaal verschillende codepaden voor de twee, dus dit kan bijvoorbeeld leiden tot het opnieuw ordenen van velden. Voor zeer grote documenten zal dat waarschijnlijk resulteren in een meetbaar prestatieverschil.
Dit laat zien dat $inc
is heel anders omdat het alleen bewerkingen toestaat die zeker op hun plaats zijn, omdat $inc
werkt alleen op numerieke typen en kan de grootte of het type natuurlijk niet wijzigen.