MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

aggiungi i campi creati_at e aggiornati_at agli schemi mongoose

AGGIORNAMENTO: (5 anni dopo)

Nota: Se decidi di utilizzare Kappa Architecture (Event Sourcing + CQRS ), quindi non è necessario aggiornare affatto la data. Poiché i tuoi dati sono un registro eventi immutabile di sola aggiunta, hai solo bisogno della data di creazione dell'evento. Simile all'Architettura Lambda , descritto sotto. Quindi lo stato dell'applicazione è una proiezione del registro eventi (dati derivati). Se ricevi un evento successivo sull'entità esistente, utilizzerai la data di creazione dell'evento come data aggiornata per la tua entità. Questa è una pratica comunemente usata (e comunemente fraintesa) nei sistemi miceroservice.

AGGIORNAMENTO: (4 anni dopo)

Se utilizzi ObjectId come tuo _id campo (che di solito è il caso), quindi tutto ciò che devi fare è:

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

Controlla la mia risposta originale di seguito su come ottenere il timestamp creato da _id campo.Se devi utilizzare gli ID da un sistema esterno, controlla la risposta di Roman Rhrn Nesterov.

AGGIORNAMENTO: (2,5 anni dopo)

Ora puoi utilizzare l'opzione #timestamps con la versione mangusta>=4.0.

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

Se sono impostati timestamp, mongoose assegna createdAt e updatedAt campi del tuo schema, il tipo assegnato è Date .

Puoi anche specificare i nomi dei file di timestamp:

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

Nota: Se stai lavorando su una grande applicazione con dati critici, dovresti riconsiderare l'aggiornamento dei tuoi documenti. Ti consiglierei di lavorare con dati immutabili di sola aggiunta (architettura lambda). Ciò significa che consenti sempre e solo gli inserti. Gli aggiornamenti e le eliminazioni non dovrebbero essere consentiti! Se desideri "eliminare" un record, puoi facilmente inserire una nuova versione del documento con alcuni timestamp /version archiviato e quindi impostare un deleted campo su true . Allo stesso modo, se desideri aggiornare un documento, ne crei uno nuovo con i campi appropriati aggiornati e il resto dei campi copiati. Quindi, per eseguire una query su questo documento, otterresti quello con il timestamp più recente o la versione più alta che non viene "cancellata" (il deleted il campo è indefinito o falso`).

L'immutabilità dei dati garantisce che i tuoi dati siano sottoposti a debug:puoi tracciare la cronologia di ogni documento. Puoi anche tornare alla versione precedente di un documento se qualcosa va storto. Se scegli un'architettura del genere ObjectId.getTimestamp() è tutto ciò di cui hai bisogno e non dipende dalla mangusta.

RISPOSTA ORIGINALE:

Se stai usando ObjectId come campo di identità non hai bisogno di created_at campo. Gli ObjectId hanno un metodo chiamato getTimestamp() .

ObjectId("507c7f79bcf86cd7994f6c0e").getTimestamp()

Questo restituirà il seguente output:

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

Maggiori informazioni qui Come si estrae la data di creazione da un Mongo ObjectID

Per aggiungere updated_at archiviato devi usare questo:

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