TL;DR:$inc
garanterer opdateringer på stedet, $set
gør det ikke, men under meget specifikke omstændigheder kan det også gøres på stedet.
Detaljer
Der er to aspekter af dette:
-
hvordan går det over ledningen?
Oplysningerne sendes som en operation, et
$set
forbliver et$set
så det er et delta. Det gælder også for den oplog, der bruges til replikering. På denne måde ved hjælp af$set
er mere effektiv med hensyn til båndbredde. -
hvordan opdateres det på disken?
MongoDB udfører en på stedet opdatering hvis og kun hvis nøglen (feltet) allerede eksisterer , så når du tilføjer et nyt felt til et dokument, er det en større operation end blot at tildele en anden værdi til et eksisterende felt.
Selv da skal værdierne dog have samme størrelse og må ikke ændre type og de skal være af typen
double, long, int or bool
, ellers er det ikke en opdatering på stedet i øjeblikket.
Jeg er ikke sikker på, hvordan det sidste er virkelig vigtigt i praksis , men serveren bruger bestemt helt forskellige kodestier til de to, så det kan f.eks. føre til feltombestilling. For meget store dokumenter vil det sandsynligvis resultere i en målbar forskel i ydeevne.
Dette viser, at $inc
er meget anderledes ved, at den kun tillader operationer, som helt sikkert er på plads, fordi $inc
fungerer kun på numeriske typer og kan naturligvis ikke ændre størrelse eller type.