sql >> Databasteknik >  >> NoSQL >> MongoDB

Uppdaterar/förnyar Mongoose upsert-operationen standardschemavärden?

Om du letar efter "bevis" för det förväntade beteendet, leta inte längre än till själva källkoden. Särskilt inom kod> huvuddefinition :

        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å där kan du se alla 'pre' mellanvaruhanterare som registreras för var och en av "uppdaterings"-metodens varianter och till samma funktionskod. Alla dessa modifierar i huvudsak $set operatorn i alla "uppdateringar" du utfärdar för att inkludera updatedAt fältet, eller vilket namn du nu mappade till den nyckeln i schemaalternativen.

Det faktiska uttalandet som skickas med "upsert"-åtgärder använder $setOnInsert för createdAt fält eller mappat alternativnamn (se överst i listan). Denna åtgärd endast gäller när en "upsert" faktiskt inträffar, så dokument som finns och bara matchar någon av "upsert"-metoderna är aldrig faktiskt berört av detta värde.

Dessa operatörer är en del av hur MongoDB fungerar och har egentligen inte med mongoose att göra, men koden som visas här visar hur mongoose "justerar" dina "uppdaterings"-åtgärder för att inkludera dessa ytterligare operationer.

För referens hela huvudfunktionen i schema.js som räknar ut vad som ska tillämpas börjar just nu på Line #798">Line /a> för genUpdates() funktion som kallas i den nedre delen av listan som visas här men den övre delen är de sista raderna av den funktionen där nycklarna till $setOnInsert bli definierad.

Så sammanfattningsvis, JA varje "uppdatering"-åtgärd är avsiktlig att updatedAt mappat fält har det aktuella Datum värde som tilldelas, och även att "uppdateringarna" är modifierade för att inkludera $setOnInsert åtgärd som endast gäller när ett nytt dokument skapas som ett resultat av en "upsert"-åtgärd för createdAt mappat fält.



  1. Kan någon förklara redis setbit-kommando?

  2. Mongo db som inte finns men dyker upp i samband

  3. Det går inte att se samlingar i mongo DB när den är ansluten via R

  4. Fördel med ett unikt index i MongoDB