MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Aktualisiert/erneuert der Mongoose-Upsert-Vorgang Standardschemawerte?

Wenn Sie nach einem "Beweis" für das erwartete Verhalten suchen, suchen Sie nicht weiter als im Quellcode selbst. Insbesondere in schema.js Hauptdefinition :

        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();
  }

Dort können Sie also alle 'pre' sehen Middleware-Handler, die für jede der "Update"-Methodenvarianten und für denselben funktionalen Code registriert sind. Diese ändern im Wesentlichen den $set -Operator in jedem "Update", das Sie ausgeben, um den updatedAt einzuschließen oder welchen Namen Sie diesem Schlüssel in den Schemaoptionen zugeordnet haben.

Die tatsächliche Anweisung, die mit „upsert“-Aktionen gesendet wird, verwendet $setOnInsert für createdAt Feld oder zugeordneter Optionsname ( siehe oben in der Auflistung ). Diese Aktion nur gilt, wenn tatsächlich ein "Upsert" auftritt, sodass Dokumente, die existieren und lediglich Übereinstimmungen für eine der "Update"-Methoden sind, nie sind tatsächlich von diesem Wert berührt.

Diese Operatoren sind Teil der Funktionsweise von MongoDB und haben nicht wirklich mit Mongoose zu tun, aber der hier gezeigte Code zeigt, wie Mongoose Ihre „Update“-Aktionen „anpasst“, um diese zusätzlichen Operationen einzuschließen.

Als Referenz die gesamte Hauptfunktion in schema.js was ausarbeitet, was derzeit anzuwenden ist, beginnt bei Zeile #798 für genUpdates() Funktion, wie sie im unteren Teil der hier gezeigten Auflistung aufgerufen wird, aber der obere Teil sind die letzten paar Zeilen dieser Funktion, in denen die Schlüssel von $setOnInsert definiert werden.

Zusammenfassend ist also JA, dass jede "Aktualisierungs"-Aktion beabsichtigt ist, dass der updatedAt zugeordnetes Feld hat das aktuelle Datum zugewiesenen Wert und auch, dass die „Updates“ so geändert werden, dass sie den $setOnInsert Aktion, die nur gilt, wenn ein neues Dokument als Ergebnis einer "Upsert"-Aktion für createdAt erstellt wird zugeordnetes Feld.