MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

ajouter les champs created_at et updated_at aux schémas de mangouste

MISE À JOUR : (5 ans plus tard)

Remarque : Si vous décidez d'utiliser Kappa Architecture (Event Sourcing + CQRS ), alors vous n'avez pas du tout besoin de la date mise à jour. Étant donné que vos données sont un journal d'événements immuable, en ajout uniquement, vous n'avez besoin que de la date de création de l'événement. Semblable à l'architecture Lambda , décrit ci-dessous. Ensuite, l'état de votre application est 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 pour votre entité. Il s'agit d'une pratique couramment utilisée (et souvent mal comprise) dans les systèmes de microservices.

MISE À JOUR : (4 ans plus tard)

Si vous utilisez ObjectId comme votre _id champ (ce qui est généralement le cas), alors tout ce que vous avez à faire est :

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

Vérifiez ma réponse d'origine ci-dessous sur la façon d'obtenir l'horodatage créé à partir du _id champ.Si vous avez besoin d'utiliser des identifiants d'un système externe, vérifiez la réponse de Roman Rhrn Nesterov.

MISE À JOUR : (2,5 ans plus tard)

Vous pouvez maintenant utiliser l'option #timestamps avec la version mangouste>=4.0.

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

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

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

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

Remarque : 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 ajout uniquement (architecture lambda). Cela signifie que vous n'autorisez que les insertions. Les mises à jour et les suppressions ne doivent pas être autorisées ! Si vous souhaitez "supprimer" un enregistrement, vous pouvez facilement insérer une nouvelle version du document avec un timestamp /version déposé puis définir un deleted champ à true . De même, si vous souhaitez mettre à jour un document, vous en créez un nouveau avec les champs appropriés mis à jour et le reste des champs copiés. Ensuite, pour interroger ce document, vous obtiendrez celui avec l'horodatage le plus récent ou la version la plus élevée qui n'est pas "supprimée". (le deleted le champ est indéfini ou faux`).

L'immuabilité 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 d'un document en cas de problème. Si vous optez pour une telle 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 domaine. Les ObjectIds ont une méthode appelée getTimestamp() .

ObjectId("507c7f79bcf86cd7994f6c0e").getTimestamp()

Cela renverra la sortie suivante :

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

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

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