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

Opdaterer/fornyer Mongoose-upsert-operationen standardskemaværdier?

Hvis du leder efter "bevis" for den forventede adfærd, så led ikke længere end selve kildekoden. Især inden for kode> hoveddefinition :

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

Så der kan du se alle 'pre' middleware-handlere, der registreres for hver af "opdaterings"-metodevarianterne og til den samme funktionelle kode. Disse modificerer alle i det væsentlige $set operatør i enhver "opdatering" du udsteder for at inkludere updatedAt felt, eller et hvilket som helst navn du tilknyttede den nøgle i skemaindstillingerne.

Den faktiske erklæring, der sendes med "upsert"-handlinger, bruger $setOnInsert for createdAt felt eller kortlagt valgmulighedsnavn (se toppen af ​​listen). Denne handling kun gælder, når en "upsert" faktisk forekommer, så dokumenter, der eksisterer og kun matcher nogen af ​​"opdatering"-metoderne, er aldrig faktisk berørt af denne værdi.

Disse operatører er en del af, hvordan MongoDB fungerer og har ikke rigtig med mongoose at gøre, men koden vist her viser, hvordan mongoose "justerer" dine "opdaterings"-handlinger for at inkludere disse yderligere operationer.

Til reference hele hovedfunktionen i schema.js som finder ud af, hvad der skal ansøges, begynder i øjeblikket på Line /a> for genUpdates() funktion som kaldet i den nederste del af listen vist her, men den øverste del er de sidste par linjer af den funktion, hvor tasterne til $setOnInsert få defineret.

Så sammenfattende, JA hver "opdatering"-handling er bevidst, at updatedAt tilknyttede felt har den aktuelle Dato værdi, der er tildelt, og også at "opdateringerne" er ændret til at inkludere $setOnInsert handling som kun gælder, når et nyt dokument oprettes som et resultat af en "upsert"-handling for createdAt kortlagt felt.



  1. Mongo DB Java 3.x-driver - Gruppér efter forespørgsel

  2. Områdeforespørgsel til MongoDB-paginering

  3. MongoDB opslagsrække af objekter efter felt (sammenføjningsbetingelser og ukorrelerede underforespørgsler)

  4. Hvorfor er koordinater af polygon GeoJSON-objekter gemt i en matrix af matrix?