Nếu bạn đang tìm kiếm "bằng chứng" về hành vi mong đợi, thì không cần tìm đâu xa hơn chính mã nguồn. Đặc biệt trong schema.js mã> định nghĩa chính
:
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();
}
Vì vậy, ở đó bạn có thể thấy tất cả 'pre'
trình xử lý phần mềm trung gian đang được đăng ký cho từng biến thể của phương pháp "cập nhật" và cho cùng một mã chức năng. Tất cả những điều này về cơ bản đều sửa đổi $ set
trong bất kỳ "bản cập nhật" nào bạn phát hành để bao gồm updatedAt
trường hoặc bất kỳ tên nào bạn đã ánh xạ tới khóa đó trong các tùy chọn lược đồ.
Báo cáo thực tế được gửi với các hành động "upert" sử dụng $ setOnInsert
cho createdAt
trường hoặc tên tùy chọn được ánh xạ (xem phần trên cùng của danh sách). Hành động này chỉ áp dụng khi "nâng cấp" thực sự xảy ra, vì vậy, các tài liệu tồn tại và chỉ phù hợp với bất kỳ phương pháp "cập nhật" nào không bao giờ thực sự cảm động bởi giá trị này.
Các toán tử đó là một phần của cách MongoDB hoạt động và không thực sự liên quan đến mongoose, nhưng đoạn mã hiển thị ở đây cho thấy cách mongoose "điều chỉnh" các hành động "cập nhật" của bạn để bao gồm các hoạt động bổ sung này.
Để tham khảo toàn bộ hàm chính trong schema.js
việc tìm hiểu những gì cần áp dụng hiện bắt đầu tại Dòng # 798 cho genUpdates ()
hàm như được gọi ở phần dưới cùng của danh sách được hiển thị ở đây nhưng phần trên cùng là vài dòng cuối cùng của hàm đó nơi các phím của $ setOnInsert
được xác định.
Vì vậy, tóm lại, CÓ mọi hành động "cập nhật" là có chủ ý rằng updatedAt
trường được ánh xạ có Ngày
hiện tại giá trị được chỉ định và "các bản cập nhật" cũng được sửa đổi để bao gồm $ setOnInsert
hành động chỉ áp dụng khi tài liệu mới được tạo do hành động "nâng cấp" cho createdAt
trường được ánh xạ.