MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Apakah operasi upsert Mongoose memperbarui/memperbarui nilai skema default?

Jika Anda mencari "bukti" dari perilaku yang diharapkan, maka tidak terlihat lagi selain kode sumber itu sendiri. Khususnya dalam schema.js definisi utama :

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

Jadi di sana Anda dapat melihat semua 'pre' penangan middleware terdaftar untuk setiap varian metode "pembaruan" dan ke kode fungsional yang sama. Ini semua pada dasarnya memodifikasi $set operator dalam "pembaruan" apa pun yang Anda keluarkan untuk menyertakan updatedAt bidang, atau nama apa pun yang Anda petakan ke kunci itu dalam opsi skema.

Pernyataan aktual yang dikirim dengan tindakan "upsert" menggunakan $setOnInsert untuk createdAt bidang atau nama opsi yang dipetakan (lihat bagian atas daftar). Tindakan ini hanya berlaku ketika "upsert" benar-benar terjadi, sehingga dokumen yang ada dan hanya cocok untuk metode "pembaruan" apa pun tidak pernah benar-benar tersentuh oleh nilai ini.

Operator tersebut adalah bagian dari cara kerja MongoDB dan tidak benar-benar berkaitan dengan luwak, tetapi kode yang ditampilkan di sini menunjukkan bagaimana luwak "menyesuaikan" tindakan "pembaruan" Anda untuk menyertakan operasi tambahan ini.

Untuk referensi seluruh fungsi utama di schema.js yang menentukan apa yang harus diterapkan saat ini dimulai di Baris #798 untuk genUpdates() fungsi seperti yang dipanggil di bagian bawah daftar yang ditampilkan di sini namun bagian atas adalah beberapa baris terakhir dari fungsi itu di mana kunci $setOnInsert ditentukan.

Jadi secara ringkas, YA setiap tindakan "pembaruan" disengaja agar updatedAt bidang yang dipetakan memiliki Date current saat ini nilai yang ditetapkan, dan juga bahwa "pembaruan" dimodifikasi untuk menyertakan $setOnInsert tindakan yang hanya berlaku ketika dokumen baru dibuat sebagai hasil dari tindakan "upsert" untuk createdAt bidang yang dipetakan.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Permintaan luwak berdasarkan tanggal

  2. Gunakan $cond dalam $match dalam agregasi mongoDB

  3. Luwak mengembalikan [Objek] alih-alih dokumen tertanam yang sebenarnya

  4. Dapatkan elemen yang dimasukkan terakhir dari mongodb di GoLang

  5. Contoh data musim semi MongoDB tidak berfungsi