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.