TL ; DR :$inc
garantit les mises à jour sur place, $set
ce n'est pas le cas, mais dans des circonstances très spécifiques, cela peut également être fait sur place.
Détails
Il y a deux aspects à cela :
-
comment passe-t-il sur le fil ?
L'information est envoyée sous la forme d'une opération, un
$set
reste un$set
c'est donc un delta. Cela est également vrai pour l'oplog utilisé pour la réplication. De cette façon, en utilisant$set
est plus efficace en termes de bande passante. -
comment est-il mis à jour sur le disque ?
MongoDB effectue une mise à jour sur place si et seulement si la clé (champ) existe déjà , ainsi, lorsque vous ajoutez un nouveau champ à un document, il s'agit d'une opération plus importante que la simple attribution d'une valeur différente à un champ existant.
Même dans ce cas, cependant, les valeurs doivent avoir la même taille et ne doit pas changer de type et ils doivent être de type
double, long, int or bool
, sinon ce n'est pas une mise à jour sur place actuellement.
Je ne sais pas en quoi ce dernier est vraiment important dans la pratique , mais le serveur utilise définitivement des chemins de code complètement différents pour les deux, ce qui peut par exemple entraîner une réorganisation des champs. Pour les documents très volumineux, cela se traduira probablement par une différence mesurable de performances.
Cela montre que $inc
est très différent en ce sens qu'il n'autorise que les opérations qui sont certainement en place, car $inc
ne fonctionne que sur les types numériques et ne peut pas changer de taille ou de type, naturellement.