อัปเดต: (5 ปีต่อมา)
หมายเหตุ:หากคุณตัดสินใจที่จะใช้สถาปัตยกรรม Kappa (การจัดหากิจกรรม + CQRS ) คุณไม่จำเป็นต้องอัพเดทวันที่เลย เนื่องจากข้อมูลของคุณเป็นบันทึกเหตุการณ์แบบไม่เปลี่ยนรูปแบบและต่อท้ายคุณจึงต้องมีวันที่สร้างเหตุการณ์เท่านั้น คล้ายกับสถาปัตยกรรมแลมบ์ดาที่อธิบายไว้ด้านล่าง สถานะแอปพลิเคชันของคุณจะเป็นเส้นโครงบันทึกเหตุการณ์ (ข้อมูลที่ได้รับ) หากคุณได้รับเหตุการณ์ที่ตามมาเกี่ยวกับเอนทิตีที่มีอยู่คุณจะใช้วันที่สร้างกิจกรรมเป็นวันที่อัปเดตสำหรับเอนทิตีของคุณ นี่คือการปฏิบัติที่ใช้กันทั่วไป (และเข้าใจผิดทั่วไป) ในระบบไมโครเซอร์วิส
อัปเดต: (4 ปีต่อมา)
หากคุณใช้ObjectId
เป็น_id
ฟิลด์ของคุณ(ซึ่งโดยปกติจะเป็นกรณี) สิ่งที่คุณต้องทำคือ:
let document = {
updatedAt: new Date(),
}
ตรวจสอบคำตอบดั้งเดิมของฉันด้านล่างเกี่ยวกับวิธีรับการประทับเวลาที่สร้างจาก_id
ฟิลด์ หากคุณต้องการใช้ ID จากระบบภายนอกให้ตรวจสอบคำตอบของ Roman Rhrn Nesterov
อัปเดต: (2.5 ปีต่อมา)
ตอนนี้คุณสามารถใช้ตัวเลือก#timestampsกับรุ่นพังพอน> = 4.0
let ItemSchema = new Schema({
name: { type: String, required: true, trim: true }
},
{
timestamps: true
});
ถ้า timestamps ชุดกำหนดพังพอนcreatedAt
และเขตแบบแผนของคุณชนิดที่ได้รับมอบหมายเป็นupdatedAt
Date
คุณยังสามารถระบุชื่อไฟล์บันทึกเวลา:
timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' }
หมายเหตุ:หากคุณกำลังทำงานกับแอปพลิเคชันขนาดใหญ่ที่มีข้อมูลสำคัญคุณควรพิจารณาการอัปเดตเอกสารของคุณอีกครั้ง ฉันขอแนะนำให้คุณทำงานกับข้อมูลที่ไม่เปลี่ยนแปลงและต่อท้ายเท่านั้น ( สถาปัตยกรรมแลมบ์ดา ) สิ่งนี้หมายความว่าคุณอนุญาตให้มีการแทรกเท่านั้น ไม่อนุญาตให้อัปเดตและลบ! หากคุณต้องการที่จะ "ลบ" บันทึกคุณได้อย่างง่ายดายสามารถแทรกรุ่นใหม่ของเอกสารที่มีบางส่วนtimestamp
/ version
ยื่นและการตั้งค่าแล้วฟิลด์deleted
true
ในทำนองเดียวกันถ้าคุณต้องการอัปเดตเอกสาร - คุณสร้างใหม่พร้อมกับอัปเดตฟิลด์ที่เหมาะสมและส่วนที่เหลือของฟิลด์ที่คัดลอกมาจากนั้นเพื่อสอบถามเอกสารนี้คุณจะได้รับเอกสารที่มีการประทับเวลาใหม่ล่าสุดหรือเวอร์ชันสูงสุด ไม่ "ลบ" (deleted
ฟิลด์ไม่ได้กำหนดหรือเท็จ `)
ความไม่สามารถเปลี่ยนแปลงของข้อมูลทำให้มั่นใจได้ว่าข้อมูลของคุณนั้นสามารถ debuggable ได้คุณสามารถติดตามประวัติของเอกสารทุกฉบับได้ นอกจากนี้คุณยังสามารถย้อนกลับไปยังเอกสารเวอร์ชันก่อนหน้าหากมีสิ่งผิดปกติ หากคุณไปกับสถาปัตยกรรมดังกล่าวObjectId.getTimestamp()
เป็นสิ่งที่คุณต้องการและไม่ขึ้นอยู่กับพังพอน
คำตอบเดิม:
หากคุณใช้ ObjectId เป็นฟิลด์ข้อมูลประจำตัวของคุณคุณไม่จำเป็นต้องใช้created_at
ฟิลด์ ObjectIds getTimestamp()
มีวิธีการที่เรียกว่า
มี objectid ( "507c7f79bcf86cd7994f6c0e"). getTimestamp ()
นี่จะส่งคืนผลลัพธ์ต่อไปนี้:
ISODate ( "2012-10-15T21: 26: 17Z")
ข้อมูลเพิ่มเติมที่นี่ฉันจะแยกวันที่สร้างออกมาจาก Mongo ObjectID ได้อย่างไร
ในการเพิ่มไฟล์ที่updated_at
คุณต้องใช้:
var ArticleSchema = new Schema({
updated_at: { type: Date }
// rest of the fields go here
});
ArticleSchema.pre('save', function(next) {
this.updated_at = Date.now();
next();
});