MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

fügt den Mongoose-Schemata die Felder created_at und updated_at hinzu

AKTUALISIERUNG: (5 Jahre später)

Hinweis: Wenn Sie sich für die Verwendung von Kappa Architecture (Event Sourcing + CQRS ), dann brauchen Sie überhaupt kein aktualisiertes Datum. Da es sich bei Ihren Daten um ein unveränderliches Ereignisprotokoll handelt, das nur angehängt werden kann, benötigen Sie immer nur das Erstellungsdatum des Ereignisses. Ähnlich der Lambda-Architektur , nachstehend beschrieben. Dann ist Ihr Anwendungsstatus eine Projektion des Ereignisprotokolls (abgeleitete Daten). Wenn Sie ein nachfolgendes Ereignis zu einer bestehenden Entität erhalten, verwenden Sie das Erstellungsdatum dieses Ereignisses als Aktualisierungsdatum für Ihre Entität. Dies ist eine häufig verwendete (und häufig missverstandene) Vorgehensweise in Miceroservice-Systemen.

AKTUALISIERUNG: (4 Jahre später)

Wenn Sie ObjectId verwenden als Ihre _id Feld (was normalerweise der Fall ist), dann müssen Sie nur noch Folgendes tun:

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

Überprüfen Sie meine ursprüngliche Antwort unten, wie Sie den erstellten Zeitstempel aus der _id erhalten Wenn Sie IDs aus einem externen System verwenden müssen, lesen Sie die Antwort von Roman Rhrn Nesterov.

AKTUALISIERUNG: (2,5 Jahre später)

Sie können jetzt die Option #timestamps mit der Mongoose-Version>=4.0 verwenden.

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

Wenn Zeitstempel gesetzt sind, weist Mongoose createdAt zu und updatedAt Felder zu Ihrem Schema hinzufügen, ist der zugewiesene Typ Date .

Sie können auch die Namen der Zeitstempeldateien angeben:

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

Hinweis: Wenn Sie an einer großen Anwendung mit kritischen Daten arbeiten, sollten Sie die Aktualisierung Ihrer Dokumente überdenken. Ich würde Ihnen raten, mit unveränderlichen Append-Only-Daten zu arbeiten (Lambda-Architektur). Das bedeutet, dass Sie immer nur Einfügungen zulassen. Aktualisierungen und Löschungen sollten nicht erlaubt sein! Wenn Sie einen Datensatz "löschen" möchten, können Sie einfach eine neue Version des Dokuments mit einem timestamp einfügen /version abgelegt und dann einen deleted setzen Feld auf true . Wenn Sie ein Dokument aktualisieren möchten, erstellen Sie ein neues Dokument, wobei die entsprechenden Felder aktualisiert und die restlichen Felder kopiert werden. Um dieses Dokument abzufragen, erhalten Sie dann das Dokument mit dem neuesten Zeitstempel oder der höchsten Version, die nicht "gelöscht" ist. (der deleted Feld ist undefiniert oder falsch`).

Die Unveränderlichkeit der Daten stellt sicher, dass Ihre Daten debugfähig sind – Sie können den Verlauf jedes Dokuments nachverfolgen. Sie können auch zur vorherigen Version eines Dokuments zurückkehren, wenn etwas schief geht. Wenn Sie sich für eine solche Architektur entscheiden, ObjectId.getTimestamp() ist alles, was Sie brauchen, und es ist nicht Mongoose-abhängig.

URSPRÜNGLICHE ANTWORT:

Wenn Sie ObjectId als Ihr Identitätsfeld verwenden, brauchen Sie created_at nicht Feld. ObjectIds haben eine Methode namens getTimestamp() .

ObjectId("507c7f79bcf86cd7994f6c0e").getTimestamp()

Dies gibt die folgende Ausgabe zurück:

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

Mehr Infos hier Wie extrahiere ich das Erstellungsdatum aus einer Mongo ObjectID

Um updated_at hinzuzufügen abgelegt, müssen Sie dies verwenden:

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