2016-09-14 4 views
7

Schema:MongoDB/Mongoose-Zeitstempel nicht aktualisiert

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(); 
}); 

Dieser Code war vor kurzem arbeiten - updatedAt für eine bestimmte Instanz kommt als 24. August, aber keine neuen Änderungen an dem Dokument nicht Update der Zeitstempel.

Fühlt sich an, als ob ich hier etwas sehr dummes verpasse.

+0

Können Sie typeof.updatedAt überprüfen? – abdulbarik

+0

@abdulbarik typeof league.updatedAt => Objekt –

+0

Ich kopiere deinen Code eingefügt und laufe auf meinem Server, und es funktioniert ganz gut mit Mungo 4.6.1, also könntest du irgendwo woanders etwas verpassen. Bitte erwähnen Sie die von Ihnen verwendete Mungo-Version oder die Mungo-Plugins. –

Antwort

0

Sie vergleichen object mit String, deshalb Bedingung ist false immer

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(); 
}); 

dies versuchen, sollte es

+0

Danke für die Antwort, aber das Problem scheint nicht mit dem Teil zu sein - das Problem mit dem Zeitstempel auf Bearbeiten nicht aktualisiert updatedAt ist. –

+0

bedeutet, dass Ihr Zustand gut funktioniert? – abdulbarik

+0

an welchem ​​Ort du feststeckst? – abdulbarik

2

arbeiten kann durch modifizieren Ihr Schema versuchen, wie:

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

für Dieses Schema Zeitstempel wird auf save(), update() und findOneAndUpdate() aktualisiert . so dass keine Notwendigkeit schema.virtual('updated')...

Prozess-2

hinzugefügt createdDate und updatedDate mit Date Typ in Ihrem Schema und aktualisiert diese Datumsfelder mit Schema-Plugin.

wie:

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); 

in schemaPlugin.js Datei:

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 und createdAt beide auf der gleichen Zeit erstellt, wenn ein neues Dokument in die Datenbank eingegeben mit Mungo so Ihre Überprüfung, ob updatedAt ist Undefiniert oder nicht ist unlogisch, da beide den gleichen Wert haben, wenn ein neues Dokument erstellt wird.

Immer wenn Sie eine Mungo-Update-Funktion oder findByIdAndUpdate oder findOneAndUpdate verwenden, wird der Wert von updatedAt automatisch aktualisiert. Verwenden Sie Mongodb-Client wie mongochef oder robomongo, um direkt den Wert des updatedAt zu überprüfen.