Apakah ada cara untuk menambahkan bidang create_at dan updated_at ke skema luwak, tanpa harus meneruskannya di setiap kali MyModel baru () dipanggil?
Bidang create_at akan menjadi tanggal dan hanya ditambahkan ketika dokumen dibuat. Bidang updated_at akan diperbarui dengan tanggal baru setiap kali save () dipanggil pada dokumen.
Saya telah mencoba ini dalam skema saya, tetapi bidang tidak muncul kecuali jika saya menambahkannya:
var ItemSchema = new Schema({
name : { type: String, required: true, trim: true }
, created_at : { type: Date, required: true, default: Date.now }
});
Jawaban:
Mulai dari Mongoose 4.0 Anda sekarang dapat mengatur opsi cap waktu pada Skema agar Mongoose menangani ini untuk Anda:
Anda dapat mengubah nama bidang yang digunakan seperti ini:
http://mongoosejs.com/docs/guide.html#timestamps
sumber
PEMBARUAN: (5 tahun kemudian)
PEMBARUAN: (4 tahun kemudian)
Jika Anda menggunakan bidang
ObjectId
Anda_id
(yang biasanya merupakan kasus), maka yang perlu Anda lakukan adalah:Lihat jawaban asli saya di bawah ini tentang cara mendapatkan cap waktu yang dibuat dari
_id
bidang. Jika Anda perlu menggunakan ID dari sistem eksternal, maka periksa jawaban Roman Rhrn Nesterov.UPDATE: (2,5 tahun kemudian)
Anda sekarang dapat menggunakan opsi #timestamps dengan versi luwak> = 4.0.
Jika mengatur cap waktu, luak menetapkan
createdAt
danupdatedAt
bidang ke skema Anda, tipe yang ditugaskan adalahDate
.Anda juga dapat menentukan nama timestamp yang diajukan:
JAWABAN ASLI:
Jika Anda menggunakan ObjectId sebagai bidang identitas Anda, Anda tidak perlu
created_at
bidang. ObjectIds memiliki metode yang disebutgetTimestamp()
.Ini akan mengembalikan output berikut:
Info lebih lanjut di sini Bagaimana cara mengekstrak tanggal yang dibuat dari Mongo ObjectID
Untuk menambahkan
updated_at
arsip, Anda harus menggunakan ini:sumber
Inilah yang akhirnya saya lakukan:
sumber
getTimestamp()
Date.now()
jika memungkinkan alih-alihnew Date
lebih cepat karena merupakan metode statisGunakan
timestamps
opsi bawaan untuk Skema Anda.Ini akan secara otomatis menambahkan
createdAt
danupdatedAt
bidang ke skema Anda.http://mongoosejs.com/docs/guide.html#timestamps
sumber
updatedAt
diperbarui pada setiap save baru (ketika obj diubah)Jika menggunakan
update()
ataufindOneAndUpdate()
dengan
{upsert: true}
opsikamu bisa memakai
$setOnInsert
sumber
_id
bidang default Mogo , maka Anda tidak perlucreatedAt
bidang. Periksa jawaban saya di bawah ini untuk perincian lebih lanjut.Tambahkan
timestamps
ke AndaSchema
seperti ini lalucreatedAt
danupdatedAt
akan menghasilkan otomatis untuk AndaAnda juga dapat mengubahnya
createdAt -> created_at
dengansumber
Inilah yang saya capai setelah dibuat dan diperbarui.
Di dalam skema saya, saya menambahkan yang dibuat dan diperbarui seperti:
Kemudian dalam metode pembaruan artikel saya di dalam pengontrol artikel saya menambahkan:
Bagian tebal adalah bagian yang menarik.
sumber
Documents: https://mongoosejs.com/docs/guide.html#timestamps
sumber
Anda dapat menggunakan
timestamp
pluginmongoose-troop
untuk menambahkan perilaku ini ke skema apa pun.sumber
Anda dapat menggunakan plugin ini dengan sangat mudah. Dari dokumen:
Dan juga mengatur nama bidang jika Anda ingin:
sumber
kita dapat mencapai ini dengan menggunakan plugin skema juga.
Dalam
helpers/schemaPlugin.js
filedan dalam
models/ItemSchema.js
file:sumber
Dalam skema model Anda, cukup tambahkan stempel waktu atribut dan berikan nilai true padanya seperti yang ditunjukkan: -
sumber
Sekarang Anda dapat menggunakan ini, sehingga tidak perlu menyertakan opsi ini di setiap tabel
sumber
Versi luwak saya adalah 4.10.2
Sepertinya hanya kail
findOneAndUpdate
yang berfungsisumber
Gunakan fungsi untuk mengembalikan nilai default yang dihitung:
sumber
Date.now()
dalam suatu fungsi cukup lakukan:...default: Date.now()
default: Date.now()
salah. Jika ada itudefault: Date.now
. Kalau tidak, semua dokumen Anda akan memiliki stempel waktu yang sama: Waktu ketika aplikasi Anda dimulai;)default: Date.now
strategi Anda . lebih bersih.Saya sebenarnya melakukan ini di belakang
Jika semuanya berjalan baik dengan pembaruan:
sumber
Gunakan machinepack-datetime untuk memformat datetime.
Paket mesin sangat bagus dengan API yang jelas tidak seperti dunia Javascript ekspres atau umum.
sumber
Anda dapat menggunakan middleware dan virtual . Ini adalah contoh untuk
updated_at
bidang Anda :sumber
name
. Dan ya, itu harus gigih.