2012-03-11 29 views
5

Tôi đang cố gắng tìm ra cách tốt nhất để theo dõi các thay đổi đối với các trường khi sử dụng mongoose.js. Ví dụ: mỗi khi trường name trên một đối tượng được đặt, tôi muốn thêm mục nhập mới vào lịch sử của đối tượng đó (dưới dạng tài liệu được nhúng) trông giống như { field: 'name', previous: 'foo', current: 'bar', date: '3/06/2012 9:06 am' }.Theo dõi các thay đổi đối với các trường bằng cách sử dụng mongoose.js

Tôi bắt đầu bằng cách cố gắng sử dụng plugin cắm .pre('save') nhưng tôi không thể tìm ra trường nào đã được sửa đổi mà không lấy giá trị cũ từ cơ sở dữ liệu và so sánh chúng. Sau đó, tôi nghĩ rằng tôi có thể sử dụng setters tùy chỉnh, nhưng tôi chạy vào cùng một vấn đề - Tôi không biết lĩnh vực đã được sửa đổi. Hiện nay tôi là trái với làm một cái gì đó giống như mà điều này mã cứng tên trường vào để setter:

var comment = new Schema({ 
    name : { type: String, set: trackName }, 
    history : [Change] 
}); 

var trackName = function(val) { 
    var change = new Change; 
    change.field = 'name'; 
    change.previous = this.name; 
    change.current = val; 
    change.date = Date.now(); 
    this.history.push(change); 
    return val; 
} 

Nhưng điều này có nghĩa là tôi cần một setter tùy chỉnh cho mỗi tên lĩnh vực mà tôi muốn theo dõi. Tôi đoán có phải là một cách tốt hơn để thực hiện điều này.

Trả lời

4

Có vẻ như tôi đã bỏ lỡ 'Document.modifiedPaths'. Điều này thực hiện chính xác những gì tôi cần để xác định trường nào đã được sửa đổi.

+3

làm cách nào bạn nhận được các giá trị cũ chỉ bằng cách sử dụng modifiedPaths? –

+1

@ Totty.js Đối với bất kỳ ai tình cờ gặp câu hỏi này, mongoose hiện không theo dõi giá trị cũ tự động, nhưng đây là một giải pháp: https://pste.me/#/FU1Kg – helion3

+0

@ helion3 có vẻ như liên kết đó đã lỗi thời –

Các vấn đề liên quan