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

320voto

Pavel Nikolov Points 3595

UPDATE : (5 ans plus tard)

Nota: Si vous décidez d'utiliser Kappa Architecture ( Recherche d'événements + CQRS ), il n'est pas nécessaire de mettre à jour la date. Puisque vos données sont un journal d'événements immuables, à ajouter uniquement, vous n'avez besoin que de la date de création de l'événement. De la même manière que le Architecture Lambda décrite ci-dessous. L'état de votre application est alors une projection du journal des événements (données dérivées). Si vous recevez un événement ultérieur concernant une entité existante, vous utiliserez la date de création de cet événement comme date de mise à jour de votre entité. Il s'agit d'une pratique courante (et souvent mal comprise) dans les systèmes de micro-services.

UPDATE : (4 ans plus tard)

Si vous utilisez ObjectId comme votre _id (ce qui est généralement le cas), il vous suffit alors de faire ce qui suit :

let document = {
  updatedAt: new Date(),
}

Consultez ma réponse originale ci-dessous sur la façon d'obtenir l'horodatage de la création à partir de la base de données de l'entreprise. _id champ. Si vous devez utiliser des identifiants provenant d'un système externe, consultez la réponse de Roman Rhrn Nesterov.

UPDATE : (2,5 ans plus tard)

Vous pouvez maintenant utiliser le #timestamps avec mongoose version >= 4.0.

let ItemSchema = new Schema({
  name: { type: String, required: true, trim: true }
},
{
  timestamps: true
});

Si des timestamps sont définis, la mangouste attribue des createdAt y updatedAt à votre schéma, le type attribué est Date .

Vous pouvez également spécifier les noms des fichiers d'horodatage :

timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' }

Nota: Si vous travaillez sur une grosse application avec des données critiques, vous devriez reconsidérer la mise à jour de vos documents. Je vous conseillerais de travailler avec des données immuables, en append-only ( architecture lambda ). Ce que cela signifie, c'est que que vous n'autorisez que les insertions. Les mises à jour et les suppressions ne doivent pas être autorisés ! Si vous souhaitez "supprimer" un document, vous pouvez facilement insérer une nouvelle version du document avec quelques timestamp / version déposé et ensuite fixer un deleted pour true . De même, si vous voulez Si vous voulez mettre à jour un document, créez-en un nouveau en mettant à jour les champs appropriés et en copiant les autres. appropriés et le reste des champs est copié. demander ce document, vous obtiendrez celui avec l'horodatage le plus récent ou la version la plus récente qui n'est pas "supprimée" (l'option deleted le champ est indéfini ou faux`).

L'immutabilité des données garantit que vos données sont déboguables - vous pouvez retracer l'historique de chaque document. Vous pouvez également revenir à la version précédente précédente d'un document si quelque chose ne va pas. Si vous optez pour un tel système architecture ObjectId.getTimestamp() est tout ce dont vous avez besoin, et ce n'est pas dépendant de Mongoose.


RÉPONSE ORIGINALE :

Si vous utilisez ObjectId comme champ d'identité, vous n'avez pas besoin de created_at champ. Les ObjectIds possèdent une méthode appelée getTimestamp() .

ObjectId("507c7f79bcf86cd7994f6c0e").getTimestamp()

Le résultat sera le suivant :

ISODate("2012-10-15T21:26:17Z")

Plus d'informations ici Comment extraire la date de création d'un ObjectID Mongo ?

Afin d'ajouter updated_at déposé vous devez utiliser ceci :

var ArticleSchema = new Schema({
  updated_at: { type: Date }
  // rest of the fields go here
});

ArticleSchema.pre('save', function(next) {
  this.updated_at = Date.now();
  next();
});

272voto

Binarytales Points 1145

Depuis la version 4.0 de Mongoose, vous pouvez maintenant définir une option d'horodatage sur le schéma pour que Mongoose s'en occupe pour vous :

var thingSchema = new Schema({..}, { timestamps: true });

Vous pouvez modifier le nom des champs utilisés comme suit :

var thingSchema = new Schema({..}, { timestamps: { createdAt: 'created_at' } });

http://mongoosejs.com/docs/guide.html#timestamps

138voto

chovy Points 8012

C'est ce que j'ai fini par faire :

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

ItemSchema.pre('save', function(next){
  now = new Date();
  this.updated_at = now;
  if ( !this.created_at ) {
    this.created_at = now;
  }
  next();
});

119voto

mcompeau Points 1181

Utilisez la fonction intégrée timestamps pour votre schéma.

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

Cela ajoutera automatiquement createdAt y updatedAt dans votre schéma.

http://mongoosejs.com/docs/guide.html#timestamps

35voto

Phan Van Linh Points 16963

Ajouter timestamps à votre Schema comme ceci alors createdAt y updatedAt sera généré automatiquement pour vous

var UserSchema = new Schema({
    email: String,
    views: { type: Number, default: 0 },
    status: Boolean
}, { timestamps: {} });

enter image description here
Vous pouvez également modifier createdAt -> created_at par

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