MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB $set écrit-il uniquement le champ ou l'ensemble du document ?

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 :

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

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