CẬP NHẬT: (5 năm sau)
Lưu ý: Nếu bạn quyết định sử dụng Kiến trúc Kappa ( Tìm nguồn cung cấp sự kiện + CQRS ), thì bạn hoàn toàn không cần cập nhật. Vì dữ liệu của bạn là nhật ký sự kiện không thay đổi, chỉ nối thêm, nên bạn chỉ cần ngày tạo sự kiện. Tương tự như Kiến trúc Lambda , được mô tả dưới đây. Sau đó, trạng thái ứng dụng của bạn là hình chiếu của nhật ký sự kiện (dữ liệu dẫn xuất). Nếu bạn nhận được một sự kiện tiếp theo về thực thể hiện có, thì bạn sẽ sử dụng ngày được tạo của sự kiện đó làm ngày cập nhật cho thực thể của mình. Đây là một thực tế thường được sử dụng (và thường bị hiểu lầm) trong các hệ thống miceroservice.
CẬP NHẬT: (4 năm sau)
Nếu bạn sử dụng ObjectId
làm _id
lĩnh vực của mình (thường là như vậy), thì tất cả những gì bạn cần làm là:
let document = {
updatedAt: new Date(),
}
Kiểm tra câu trả lời ban đầu của tôi dưới đây về cách lấy dấu thời gian đã tạo từ _id
trường. Nếu bạn cần sử dụng ID từ hệ thống bên ngoài, hãy kiểm tra câu trả lời của Roman Rhrn Nesterov.
CẬP NHẬT: (2,5 năm sau)
Bây giờ bạn có thể sử dụng tùy chọn #timestamp với phiên bản mongoose> = 4.0.
let ItemSchema = new Schema({
name: { type: String, required: true, trim: true }
},
{
timestamps: true
});
Nếu đặt dấu thời gian, mongoose gán createdAt
và updatedAt
các trường cho lược đồ của bạn, loại được gán là Date
.
Bạn cũng có thể chỉ định tên của dấu thời gian:
timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' }
Lưu ý: Nếu bạn đang làm việc trên một ứng dụng lớn có dữ liệu quan trọng, bạn nên xem xét lại việc cập nhật tài liệu của mình. Tôi sẽ khuyên bạn nên làm việc với dữ liệu bất biến, chỉ bổ sung ( kiến trúc lambda ). Điều này có nghĩa là bạn chỉ bao giờ cho phép chèn. Cập nhật và xóa không nên được cho phép! Nếu bạn muốn "xóa" một bản ghi, bạn có thể dễ dàng chèn một phiên bản mới của tài liệu với một số timestamp
/ version
nộp và sau đó đặt một deleted
trường thành true
. Tương tự như vậy nếu bạn muốn cập nhật một tài liệu - bạn tạo một tài liệu mới với các trường thích hợp được cập nhật và phần còn lại của các trường được sao chép. Sau đó, để truy vấn tài liệu này, bạn sẽ nhận được một tài liệu có dấu thời gian mới nhất hoặc phiên bản cao nhất không "xóa" (deleted
trường không xác định hoặc sai`).
Tính không thay đổi dữ liệu đảm bảo rằng dữ liệu của bạn có thể gỡ lỗi - bạn có thể theo dõi lịch sử của mọi tài liệu. Bạn cũng có thể quay lại phiên bản trước của tài liệu nếu có sự cố. Nếu bạn đi với một kiến trúc như vậy ObjectId.getTimestamp()
là tất cả những gì bạn cần, và nó không phụ thuộc vào Mongoose.
TRẢ LỜI GỐC:
Nếu bạn đang sử dụng ObjectId làm trường nhận dạng, bạn không cần created_at
trường. ObjectIds có một phương thức gọi là getTimestamp()
.
ObjectId ("507c7f79bcf86cd7994f6c0e"). GetTimestamp ()
Điều này sẽ trả về đầu ra sau:
ISODate ("2012-10-15T21: 26: 17Z")
Thông tin thêm ở đây Làm cách nào để trích xuất ngày đã tạo ra khỏi Mongo ObjectID
Để thêm updated_at
tệp bạn cần sử dụng:
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();
});