2016-09-14 17 views
7

Schema:MongoDB/Mongoose timestamps không cập nhật

var schema = new Schema({...}, { 
    timestamps: true, 
    id: false, 
    toJSON: { 
     virtuals: true, 
    }, 
    toObject: { 
     virtual: true, 
    } 
}); 
schema.virtual('updated').get(function() { 
    if(typeof this.updatedAt === "undefined" && typeof this.createdAt === "undefined") return ""; 
    var updated = (typeof this.updatedAt === "undefined") ? this.createdAt : this.updatedAt; 
    return "Updated "+moment(updated).fromNow(); 
}); 

này đang làm việc thời gian gần đây - updatedAt cho một ví dụ cụ thể đi lên như ngày 24 tháng 8, tuy nhiên bất kỳ sửa đổi mới để các tài liệu không cập nhật dấu thời gian.

Cảm thấy như tôi đang thiếu điều gì đó rất ngớ ngẩn ở đây.

+0

Bạn có thể kiểm tra typeof this.updatedAt không? – abdulbarik

+0

@abdulbarik typeof league.updatedAt => đối tượng –

+0

Tôi sao chép dán mã của bạn và chạy trên máy chủ của tôi, và nó hoạt động hoàn toàn tốt với mongoose 4.6.1, Vì vậy, có thể bạn đang thiếu một cái gì đó ở một nơi khác. Vui lòng đề cập đến phiên bản mongoose bạn đang sử dụng hoặc bất kỳ trình cắm thêm mongoose nào. –

Trả lời

0

Bạn đang so sánh object với String, đó là lý do tại sao điều kiện là false luôn

schema.virtual('updated').get(function() { 
    if(typeof this.updatedAt === undefined && typeof this.createdAt === undefined) return ""; 
    var updated = (typeof this.updatedAt === undefined) ? this.createdAt : this.updatedAt; 
    return "Updated "+moment(updated).fromNow(); 
}); 

Hãy thử điều này, cần làm việc

+0

Cảm ơn câu trả lời, nhưng vấn đề dường như không phải với phần đó - vấn đề là với dấu thời gian cập nhậtAt không cập nhật trên chỉnh sửa. –

+0

có nghĩa là tình trạng của bạn đang hoạt động tốt? – abdulbarik

+0

nơi bạn bị kẹt ở đâu? – abdulbarik

2

có thể thử bằng cách thay đổi sơ đồ của bạn như:

var schema =new Schema({..}, 
      { timestamps: { createdAt: 'createdDate',updatedAt: 'updatedDate' } 
}); 

cho lịch trình lược đồ này sẽ cập nhật trên save(), update()findOneAndUpdate() . vì vậy không cần schema.virtual('updated')...

Process-2

thêm createdDateupdatedDate với Date gõ vào giản đồ của bạn và cập nhật các trường ngày sử dụng schema Plugin.

như:

var mongoose = require('mongoose'), 
    Schema = mongoose.Schema, 
    SchemaPlugin = require('../helpers/schemaPlugin'); 
    var schema =new Schema({..}, 
    createdDate: { 
     type: Date, 
     default: Date.now 
    }, 
    updatedDate: { 
     type: Date, 
     default: Date.now 
    } 
    }); 

    schema.plugin(SchemaPlugin); 

trong schemaPlugin.js file:

module.exports = function(schema) { 

    var updateTimestemps = function(next){ 
    var self = this; 


    if(!self.createdAt) { 
     self.createdDate = new Date(); 
     //or self.update({},{ $set: { createdDate : new Date(), updatedDate: new Date() } }); 
    } else { 
     self.updatedDate= new Date(); 
     //or self.update({},{ $set: {updatedDate: new Date() } }); 
    } 
    next(); 
    }; 

    schema. 
    pre('save', updateTimestemps). 
    pre('update', updateTimestemps). 
    pre('findOneAndUpdate', updateTimestemps); 
}; 
1

updatedAt và createdAt cả tạo trên cùng một thời điểm khi một tài liệu mới được nhập vào cơ sở dữ liệu sử dụng mongoose nên kiểm tra lại xem updatedAt là không xác định hoặc không hợp lý vì cả hai sẽ có cùng giá trị khi tạo tài liệu mới.

Bất cứ khi nào bạn sử dụng hàm cập nhật mongoose hoặc findByIdAndUpdate hoặc findOneAndUpdate giá trị của cập nhật sẽ được cập nhật tự động. Sử dụng ứng dụng Mongodb như mongochef hoặc robomongo để kiểm tra trực tiếp giá trị của cập nhậtAt.

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