MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Schreibt MongoDB $set nur das Feld oder das gesamte Dokument?

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:

  1. 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.

  2. 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.