_Erstens: Eine Problemumgehung, um dieses Problem zu beheben:_
Model.findOne({id: 'blabla'}).select('email password createdAt').lean().exec()
Ich verwende ein createdAt
-Feld, das einen abläuft (TTL 24h
) und einen Standardwert ( Date.now
) hat- in meinem Users
Modell, um die Erstellung zu speichern Datumsinfo der neu angelegten Benutzer.
Wenn der Benutzer das Konto aktiviert, entfernt das System das Feld createdAt
.
Wenn der Benutzer das Konto nicht aktiviert, entfernt das System das Konto nach 24 Stunden aus der Users
Sammlung.
Bei meinen Authentifizierungsvorgängen überprüfe ich zuerst das vorhandene Feld createdAt
.
Wenn der Benutzer nicht aktiviert ist, zeige ich eine Nachricht wie Account is not activated.
Wenn ich die Methode FindOne
für das obige Authentifizierungsverfahren versuche, erhalte ich den Date.now
, obwohl im Dokument kein Feld createdAt
ist, da der Benutzer sein Konto aktiviert hat .
createdAt
Feld in meinem User
Modell:
createdAt: { type: Date, expires: '24h', default: Date.now },
Meine Methode:
Users.findOne({email: username}, 'email, password, createdAt', function(err, user) {
Durch die Verwendung der obigen Methode createdAt
Wert jedes Mal zurückgegeben.
PS: Ich habe das Problem gesucht, aber nichts gefunden.
So funktionieren die Standardeinstellungen, wenn im Dokument kein createdAt
Feld vorhanden ist. Mungo fügt eines hinzu. Wenn Sie beim Erstellen eines neuen Dokuments nur createdAt
hinzufügen möchten:
schema.pre('save', function(next) {
if (this.isNew) {
this.createdAt = Date.now();
}
next();
});
Außerdem würde ich nicht empfehlen, die Felder in Ihrer Projektion Users.findOne({email: username}, 'email, password, createdAt' /** <-- remove commas here */)
durch Kommas zu trennen.
Stolperte über das gleiche Problem.
@vkarpov15 sollte so nicht funktionieren. Obwohl beim Speichern der Standardwert festgelegt wird, ist es irreführend, ihn beim find
des Dokuments festzulegen, da es eigentlich exakte Daten zurückgeben sollte, die in der DB gespeichert sind, nicht wahr? Ich würde für eine Wiederaufnahme des Themas stimmen.
Nicht unbedingt, Mungo hat viele Stellen, an denen das Dokument nicht die genauen Daten darstellt, die in der Datenbank gespeichert sind: Getter, Virtuals usw. Wie auch immer, wir behaupten dieses Verhalten und eine Änderung würde den Code vieler Leute brechen, also Wir werden es nicht ändern, es sei denn, es gibt eine große Nachfrage, es zu ändern. Hier ist eine Problemumgehung:
createdAt: {
type: Date,
default: function() {
if (this.isNew) { return new Date(); }
return undefined;
}
}
Dadurch wird createdAt
nur beim Speichern in der Datenbank festgelegt, aber undefined
wenn Sie ein Dokument aus der Datenbank geladen haben und createdAt
nicht ist einstellen.
Hilfreichster Kommentar
Stolperte über das gleiche Problem.
@vkarpov15 sollte so nicht funktionieren. Obwohl beim Speichern der Standardwert festgelegt wird, ist es irreführend, ihn beim
find
des Dokuments festzulegen, da es eigentlich exakte Daten zurückgeben sollte, die in der DB gespeichert sind, nicht wahr? Ich würde für eine Wiederaufnahme des Themas stimmen.