Mongoose: FindOne gibt den Standardwert der nicht vorhandenen Datei zurück.

Erstellt am 23. Juli 2016  ·  3Kommentare  ·  Quelle: Automattic/mongoose

_Erstens: Eine Problemumgehung, um dieses Problem zu beheben:_
Model.findOne({id: 'blabla'}).select('email password createdAt').lean().exec()

Ausgabe:

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.

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.

Alle 3 Kommentare

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.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

p3x-robot picture p3x-robot  ·  3Kommentare

simonxca picture simonxca  ·  3Kommentare

ghost picture ghost  ·  3Kommentare

Soviut picture Soviut  ·  3Kommentare

adamreisnz picture adamreisnz  ·  3Kommentare