MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Mongoose aggiorna/rinnova i valori di schema predefiniti dell'operazione?

Se stai cercando una "prova" del comportamento previsto, non cercare oltre il codice sorgente stesso. In particolare all'interno di schema.js definizione 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();
  }

Quindi lì puoi vedere tutto il 'pre' gestori di middleware registrati per ciascuna delle varianti del metodo "aggiornamento" e allo stesso codice funzionale. Tutti questi sostanzialmente modificano il $set operatore in qualsiasi "aggiornamento" che emetti per includere updatedAt campo o qualsiasi altro nome che hai mappato a quella chiave nelle opzioni dello schema.

La dichiarazione effettiva inviata con le azioni "upsert" utilizza $setOnInsert per createdAt campo o nome dell'opzione mappata (vedi la parte superiore dell'elenco). Questa azione solo si applica quando si verifica effettivamente un "upsert", quindi i documenti che esistono e sono semplicemente corrispondenze per uno qualsiasi dei metodi di "aggiornamento" sono mai effettivamente toccato da questo valore.

Questi operatori fanno parte del funzionamento di MongoDB e non hanno davvero a che fare con Mongoose, ma il codice mostrato qui mostra come Mongoose "regola" le tue azioni di "aggiornamento" per includere queste operazioni aggiuntive.

Per riferimento l'intera funzione principale in schema.js che risolve cosa applicare attualmente inizia a Linea #798 per genUpdates() funzione come chiamata nella parte inferiore dell'elenco mostrato qui, tuttavia la parte superiore sono le ultime righe di quella funzione in cui le chiavi di $setOnInsert definisci.

Quindi, in sintesi, SÌ ogni azione di "aggiornamento" è intenzionale rispetto a updatedAt il campo mappato ha la Date corrente valore assegnato e anche che gli "aggiornamenti" siano modificati per includere $setOnInsert azione che solo si applica quando viene creato un nuovo documento come risultato di un'azione "upsert" per createdAt campo mappato.