sql >> Database >  >> NoSQL >> MongoDB

Update/vernieuwt Mongoose upsert-bewerking de standaardschemawaarden?

Als u op zoek bent naar "bewijs" van het verwachte gedrag, zoek dan niet verder dan de broncode zelf. Met name binnen de schema.js hoofddefinitie :

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

Dus daar kun je alle 'pre' . zien middleware-handlers worden geregistreerd voor elk van de "update"-methodevarianten en voor dezelfde functionele code. Deze wijzigen in wezen de $set operator in elke "update" die u uitgeeft om de updatedAt . op te nemen veld, of welke naam je ook hebt toegewezen aan die sleutel in de schema-opties.

De feitelijke instructie die wordt verzonden met "upsert" -acties gebruikt $setOnInsert voor de createdAt veld of toegewezen optienaam (zie bovenaan de lijst). Deze actie alleen is van toepassing wanneer een "upsert" daadwerkelijk optreedt, dus documenten die bestaan ​​en slechts overeenkomen met een van de "update"-methoden zijn nooit daadwerkelijk geraakt door deze waarde.

Die operators maken deel uit van hoe MongoDB werkt en hebben niet echt met mangoest te maken, maar de hier getoonde code laat zien hoe mangoest uw "update" -acties "aanpast" om deze extra bewerkingen op te nemen.

Ter referentie de hele hoofdfunctie in schema.js die uitwerkt wat u momenteel moet toepassen, begint bij regel #798 voor de genUpdates() functie zoals aangeroepen in het onderste deel van de lijst die hier wordt getoond, maar het bovenste deel is de laatste paar regels van die functie waar de toetsen van $setOnInsert word gedefinieerd.

Dus kort samengevat, JA, elke "update" -actie is opzettelijk dat de updatedAt toegewezen veld heeft de huidige Date waarde toegewezen, en ook dat de "updates" zijn gewijzigd om de $setOnInsert actie die alleen is van toepassing wanneer een nieuw document wordt gemaakt als resultaat van een "upsert" -actie voor de createdAt toegewezen veld.



  1. Hoe 100 miljoen records in MongoDB te laden met Scala voor prestatietests?

  2. Producten, opties/tags en categorieën opslaan, organiseren en opvragen

  3. Hoe GridFS te gebruiken om afbeeldingen op te slaan met Node.js en Mongoose

  4. Hoe krijg ik een datum om op te slaan als een datum in MongoDB in plaats van een Int64?