254 votes

ajouter les champs created_at et updated_at aux schémas mongoose

Existe-t-il un moyen d'ajouter created_at et updated_at à un schéma de la mangouste, sans avoir à les transmettre à chaque fois qu'une nouvelle MyModel() s'appelle ?

Le site created_at serait une date et ne serait ajouté que lorsqu'un document est créé. Le site updated_at sera mis à jour avec la nouvelle date chaque fois que save() est appelé sur un document.

J'ai essayé de le faire dans mon schéma, mais le champ n'apparaît pas à moins que je ne l'ajoute explicitement :

var ItemSchema = new Schema({
    name    : { type: String, required: true, trim: true },
    created_at    : { type: Date, required: true, default: Date.now }
});

8voto

Nikolay_R Points 94
var ItemSchema = new Schema({
    name : { type: String, required: true, trim: true }
});

ItemSchema.set('timestamps', true); // this will add createdAt and updatedAt timestamps

Docs : https://mongoosejs.com/docs/guide.html#timestamps

5voto

JohnnyHK Points 61191

Vous pouvez utiliser le timestamp plugin de mongoose-troop pour ajouter ce comportement à n'importe quel schéma.

5voto

Shaishab Roy Points 9680

Nous pouvons y parvenir en utilisant plugin de schéma également.

En helpers/schemaPlugin.js fichier

module.exports = function(schema) {

  var updateDate = function(next){
    var self = this;
    self.updated_at = new Date();
    if ( !self.created_at ) {
      self.created_at = now;
    }
    next()
  };
  // update date for bellow 4 methods
  schema.pre('save', updateDate)
    .pre('update', updateDate)
    .pre('findOneAndUpdate', updateDate)
    .pre('findByIdAndUpdate', updateDate);
};

et en models/ItemSchema.js fichier :

var mongoose = require('mongoose'),
  Schema   = mongoose.Schema,
  SchemaPlugin = require('../helpers/schemaPlugin');

var ItemSchema = new Schema({
  name    : { type: String, required: true, trim: true },
  created_at    : { type: Date },
  updated_at    : { type: Date }
});
ItemSchema.plugin(SchemaPlugin);
module.exports = mongoose.model('Item', ItemSchema);

5voto

Dr.Bronx Points 106

Si vous utilisez nestjs et le décorateur @Schema, vous pouvez réaliser ceci comme suit :

@Schema({
  timestamps: true,
})

L'option timestamps indique à la mangouste d'affecter les champs createdAt et updatedAt à votre schéma. Le type attribué est Date.

Par défaut, les noms des champs sont createdAt et updatedAt.

Personnalisez les noms des champs en définissant timestamps.createdAt et timestamps.updatedAt.

4voto

Orr Points 1053

Vous pouvez utiliser ce plugin très facilement. Dans la documentation :

var timestamps = require('mongoose-timestamp');
var UserSchema = new Schema({
    username: String
});
UserSchema.plugin(timestamps);
mongoose.model('User', UserSchema);
var User = mongoose.model('User', UserSchema)

Vous pouvez également définir le nom des champs si vous le souhaitez :

mongoose.plugin(timestamps,  {
  createdAt: 'created_at', 
  updatedAt: 'updated_at'
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X