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

L'opération d'upsert de Mongoose met-elle à jour/renouvelle-t-elle les valeurs de schéma par défaut ?

Si vous recherchez une "preuve" du comportement attendu, ne cherchez pas plus loin que le code source lui-même. En particulier dans le schema.js définition principale :

        updates.$setOnInsert = {};
        updates.$setOnInsert[createdAt] = now;
      }

      return updates;
    };

    this.methods.initializeTimestamps = function() {
      if (createdAt && !this.get(createdAt)) {
        this.set(createdAt, new Date());
      }
      if (updatedAt && !this.get(updatedAt)) {
        this.set(updatedAt, new Date());
      }
      return this;
    };

    this.pre('findOneAndUpdate', _setTimestampsOnUpdate);
    this.pre('update', _setTimestampsOnUpdate);
    this.pre('updateOne', _setTimestampsOnUpdate);
    this.pre('updateMany', _setTimestampsOnUpdate);
  }

  function _setTimestampsOnUpdate(next) {
    var overwrite = this.options.overwrite;
    this.update({}, genUpdates(this.getUpdate(), overwrite), {
      overwrite: overwrite
    });
    applyTimestampsToChildren(this);
    next();
  }

Donc là, vous pouvez voir tous les 'pre' les gestionnaires de middleware étant enregistrés pour chacune des variantes de méthode "mise à jour" et au même code fonctionnel. Ceux-ci modifient tous essentiellement le $set opérateur dans toute "mise à jour" que vous émettez pour inclure le updatedAt champ, ou tout autre nom que vous avez mappé à cette clé dans les options du schéma.

La déclaration réelle envoyée avec les actions "upsert" utilise $setOnInsert pour le createdAt nom du champ ou de l'option mappée (voir en haut de la liste). Cette action uniquement s'applique lorsqu'un "upsert" se produit réellement, de sorte que les documents qui existent et qui correspondent simplement à l'une des méthodes de "mise à jour" ne sont jamais réellement touché par cette valeur.

Ces opérateurs font partie du fonctionnement de MongoDB et n'ont pas vraiment à voir avec mongoose, mais le code présenté ici montre comment mongoose "ajuste" vos actions de "mise à jour" afin d'inclure ces opérations supplémentaires.

Pour référence, l'ensemble de la fonction principale dans schema.js qui détermine ce qu'il faut appliquer commence actuellement à Ligne #798 pour genUpdates() fonction appelée dans la partie inférieure de la liste présentée ici, mais la partie supérieure correspond aux dernières lignes de cette fonction où les clés de $setOnInsert se définir.

Donc, en résumé, OUI chaque action de "mise à jour" est intentionnelle que le updatedAt le champ mappé a la Date actuelle valeur attribuée, et aussi que les "mises à jour" sont modifiées pour inclure le $setOnInsert action qui uniquement s'applique lorsqu'un nouveau document est créé à la suite d'une action "upsert" pour le createdAt champ mappé.