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
$set
bleibt ein$set
Es ist also ein Delta. Das gilt auch für das Oplog, das für die Replikation verwendet wird. Verwenden Sie auf diese Weise$set
ist 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.