TL;DR:$inc garantiert direkte Updates, $set nicht, aber unter ganz bestimmten Umständen kann es auch vor Ort durchgeführt werden.
Einzelheiten
Dazu gibt es zwei Aspekte:
-
Wie geht es über den Draht?
Die Informationen werden als Operation gesendet, ein
$setbleibt ein$setEs ist also ein Delta. Das gilt auch für das Oplog, das für die Replikation verwendet wird. Verwenden Sie auf diese Weise$setist hinsichtlich der Bandbreite effizienter. -
Wie wird es auf der Festplatte aktualisiert?
MongoDB führt ein direktes Update durch nur wenn der Schlüssel (Feld) bereits existiert , wenn Sie also einem Dokument ein neues Feld hinzufügen, ist das ein größerer Vorgang, als einem vorhandenen Feld einfach einen anderen Wert zuzuweisen.
Aber auch dann müssen die Werte gleich groß sein und darf den Typ nicht ändern und sie müssen vom Typ sein
double, long, int or bool, andernfalls nicht derzeit ein In-Place-Update.
Ich bin mir nicht sicher, inwiefern letzteres in der Praxis wirklich wichtig ist , aber der Server verwendet definitiv völlig unterschiedliche Codepfade für die beiden, sodass es beispielsweise zu einer Neuordnung der Felder kommen kann. Bei sehr großen Dokumenten führt dies wahrscheinlich zu einem messbaren Leistungsunterschied.
Dies zeigt, dass $inc ist insofern sehr unterschiedlich, als es nur Operationen zulässt, die sicher vorhanden sind, weil $inc funktioniert nur mit numerischen Typen und kann natürlich weder Größe noch Typ ändern.