MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Czy operacja upsert Mongoose aktualizuje/odnawia domyślne wartości schematu?

Jeśli szukasz „dowodu” oczekiwanego zachowania, nie szukaj dalej niż sam kod źródłowy. Szczególnie w schema.js kod> główna definicja :

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

Możesz więc zobaczyć wszystkie 'pre' programy obsługi oprogramowania pośredniego są rejestrowane dla każdego z wariantów metody „aktualizacji” i do tego samego kodu funkcjonalnego. Wszystkie one zasadniczo modyfikują $set operator w każdej „aktualizacji”, którą wydajesz, aby uwzględnić updatedAt pole lub jakakolwiek nazwa przypisana do tego klucza w opcjach schematu.

Rzeczywista instrukcja wysłana z akcjami „upsert” używa $setOnInsert dla createdAt nazwa pola lub zmapowanej opcji ( patrz góra listy ). To działanie tylko ma zastosowanie, gdy rzeczywiście występuje „upsert”, więc dokumenty, które istnieją i są jedynie dopasowane do którejkolwiek z metod „aktualizacji”, nigdy faktycznie dotknięty przez tę wartość.

Te operatory są częścią działania MongoDB i nie mają nic wspólnego z mongoose, ale pokazany tutaj kod pokazuje, w jaki sposób mongoose „dostosowuje” twoje akcje „aktualizacji”, aby uwzględnić te dodatkowe operacje.

Dla odniesienia cała główna funkcja w schema.js która sprawdza, co należy zastosować, obecnie zaczyna się od Linia #798 dla genUpdates() funkcja nazywana w dolnej części wykazu pokazanego tutaj, ale górna część to kilka ostatnich wierszy tej funkcji, w których klawisze $setOnInsert zdefiniuj.

Podsumowując, TAK, każde działanie „aktualizacji” jest celowe, aby updatedAt mapowane pole ma aktualną datę przypisana wartość, a także, że „aktualizacje” zostały zmodyfikowane w celu uwzględnienia $setOnInsert działanie, które tylko ma zastosowanie, gdy nowy dokument jest tworzony w wyniku akcji "upsert" dla createdAt mapowane pole.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Węzeł referencyjny typu Mongodb

  2. Błąd podczas aktualizacji Mongodb z 3.2 do 3.6

  3. Uruchamianie Meteor na hoście lokalnym kończy się niepowodzeniem z RangeError:port powinien być>=0 i <65536:NaN

  4. Jak ukryć _id przed agregacją?

  5. Dopasuj wiele kryteriów w tablicy