MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Операцията на Mongoose upsert актуализира/подновява ли стойностите на схемата по подразбиране?

Ако търсите "доказателство" за очакваното поведение, тогава не търсете повече от самия изходен код. По-специално в рамките на schema.js основна дефиниция :

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

Така че там можете да видите всички „pre“ манипулатори на междинен софтуер, регистрирани за всеки от вариантите на метода за "актуализация" и към един и същ функционален код. Всички те по същество променят $set във всяка „актуализация“, която издавате, за да включите updatedAt или каквото и да е име, което сте присвоили на този ключ в опциите на схемата.

Действителното изявление, изпратено с действията "upsert", използва $setOnInsert за createdAt име на поле или нанесена опция (вижте горната част на списъка). Само това действиена се прилага, когато действително се появи „upsert“, така че документите, които съществуват и са просто съвпадения за който и да е от методите за „актуализация“, са никога действително докоснати от тази стойност.

Тези оператори са част от начина, по който работи MongoDB и нямат нищо общо с mongoose, но кодът, показан тук, показва как mongoose „настройва“ вашите действия за „актуализация“, за да включи тези допълнителни операции.

За справка цялата основна функция в schema.js който определя какво да се приложи в момента, започва от Ред #798 за genUpdates() функция, както се извиква в долната част на списъка, показан тук, но горната част са последните няколко реда на тази функция, където са ключовете на $setOnInsert дефинирайте.

Така че в обобщение, ДА всяко действие „актуализация“ е умишлено, че updatedAt картографираното поле има текущата Дата присвоена стойност, както и че „актуализациите“ са модифицирани, за да включват $setOnInsert действие койсамо се прилага, когато е създаден нов документ в резултат на действие "upsert" за createdAt картографирано поле.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Позволете на новия ClusterControl да защити вашите внедрявания на MongoDB

  2. Автоматично премахване на препращащи обекти при изтриване в MongoDB

  3. mongodb как да заявя сума низ?

  4. Стойността за дата и час на MongoDB не се съхранява правилно

  5. mongoose Find с множество условия