Gibt es eine Möglichkeit, einem Mungo-Schema die Felder "created_at" und "updated_at" hinzuzufügen, ohne sie bei jedem Aufruf von "MyModel ()" übergeben zu müssen?
Das Feld created_at ist ein Datum und wird nur hinzugefügt, wenn ein Dokument erstellt wird. Das Feld update_at wird jedes Mal mit einem neuen Datum aktualisiert, wenn save () für ein Dokument aufgerufen wird.
Ich habe dies in meinem Schema versucht, aber das Feld wird nur angezeigt, wenn ich es ausdrücklich hinzufüge:
var ItemSchema = new Schema({
name : { type: String, required: true, trim: true }
, created_at : { type: Date, required: true, default: Date.now }
});
Antworten:
Ab Mongoose 4.0 können Sie jetzt eine Zeitstempeloption für das Schema festlegen, damit Mongoose dies für Sie erledigt:
Sie können den Namen der verwendeten Felder folgendermaßen ändern:
http://mongoosejs.com/docs/guide.html#timestamps
quelle
UPDATE: (5 Jahre später)
UPDATE: (4 Jahre später)
Wenn Sie
ObjectId
als_id
Feld verwenden (was normalerweise der Fall ist), müssen Sie nur Folgendes tun:Überprüfen Sie meine ursprüngliche Antwort unten, wie Sie den erstellten Zeitstempel aus dem
_id
Feld erhalten. Wenn Sie IDs von einem externen System verwenden müssen, überprüfen Sie die Antwort von Roman Rhrn Nesterov.UPDATE: (2,5 Jahre später)
Sie können jetzt die Option #timestamps mit der Mungo-Version> = 4.0 verwenden.
Wenn Sie Ihrem Schema Zeitstempel, Mungos
createdAt
undupdatedAt
Felder zuweisen, wird der Typ zugewiesenDate
.Sie können auch die Namen der Zeitstempeldateien angeben:
URSPRÜNGLICHE ANTWORT:
Wenn Sie ObjectId als Identitätsfeld verwenden, benötigen Sie kein
created_at
Feld. ObjectIds haben eine Methode namensgetTimestamp()
.Dies gibt die folgende Ausgabe zurück:
Weitere Informationen hier Wie extrahiere ich das Erstellungsdatum aus einer Mongo ObjectID
Um Dateien hinzuzufügen
updated_at
, müssen Sie Folgendes verwenden:quelle
Das habe ich letztendlich getan:
quelle
getTimestamp()
Date.now()
wo es möglich ist, anstatt esnew Date
schneller zu machen, da es eine statische Methode istVerwenden Sie die integrierte
timestamps
Option für Ihr Schema.Dies fügt automatisch
createdAt
und hinzuupdatedAt
Felder zu Ihrem Schema.http://mongoosejs.com/docs/guide.html#timestamps
quelle
updatedAt
wird bei jedem neuen Speichern aktualisiert (wenn das Objekt geändert wird)Wenn verwenden
update()
oderfindOneAndUpdate()
mit
{upsert: true}
OptionSie können verwenden
$setOnInsert
quelle
_id
, benötigen Sie keincreatedAt
Feld. Überprüfen Sie meine Antwort unten für weitere Details.Fügen
timestamps
SieSchema
dies dann hinzucreatedAt
undupdatedAt
generieren Sie es automatisch für SieSie können auch ändern ,
createdAt -> created_at
indemquelle
So habe ich erreicht und aktualisiert.
In meinem Schema habe ich das erstellte und aktualisierte wie folgt hinzugefügt:
Dann habe ich in meiner Artikelaktualisierungsmethode im Artikel-Controller Folgendes hinzugefügt:
Die fett gedruckten Abschnitte sind die Teile von Interesse.
quelle
Dokumente: https://mongoosejs.com/docs/guide.html#timestamps
quelle
Sie können das
timestamp
Plugin von verwendenmongoose-troop
, um dieses Verhalten einem beliebigen Schema hinzuzufügen.quelle
Sie können dieses Plugin sehr einfach verwenden. Aus den Dokumenten:
Und legen Sie auch den Namen der Felder fest, wenn Sie möchten:
quelle
Wir können dies erreichen, indem wir auch das Schema-Plugin verwenden .
In
helpers/schemaPlugin.js
Dateiund in
models/ItemSchema.js
Datei:quelle
In Ihrem Modellschema, fügen Sie einfach eine Attribut Zeitstempel und assign Wert wahr , um es wie folgt: -
quelle
Jetzt können Sie dies verwenden, sodass diese Option nicht in jede Tabelle aufgenommen werden muss
quelle
Meine Mungo-Version ist 4.10.2
Scheint nur der Haken
findOneAndUpdate
ist Arbeitquelle
Verwenden Sie eine Funktion, um den berechneten Standardwert zurückzugeben:
quelle
Date.now()
eine Funktion...default: Date.now()
default: Date.now()
das falsch wäre. Wenn überhaupt, ist esdefault: Date.now
. Andernfalls haben alle Ihre Dokumente den gleichen Zeitstempel: Die Zeit, zu der Ihre Anwendung gestartet wurde;)default: Date.now
Strategie. viel sauberer.Ich mache das eigentlich hinten
Wenn mit der Aktualisierung alles gut geht:
quelle
Verwenden Sie machinepack-datetime, um die datetime zu formatieren.
Im Gegensatz zur Express- oder allgemeinen Javascript-Welt ist das Maschinenpaket mit einer klaren API großartig.
quelle
Sie können Middleware und Virtuals verwenden . Hier ist ein Beispiel für Ihr
updated_at
Fachgebiet:quelle
name
. Und ja, es sollte hartnäckig sein.