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

So entfernen Sie nicht verifizierte Benutzer mit Mongoose und TTL

Erstens denke ich, dass Ihre Schemadefinition kein gültiges Mongoose-Schema ist. Ich habe den local.type entfernt.

Außerdem habe ich dem Verifizierungsablaufdatum ein Standarddatum mit einem Ablauf von 3 Minuten gegeben, Sie können diesen Wert ändern.

Das Schema muss also so aussehen:

const mongoose = require("mongoose");

const userSchema = new mongoose.Schema({
  local: new mongoose.Schema({
    email: { type: String, unique: true, required: true },
    name: { type: String, required: true },
    password: { type: String, required: true },
    resetPasswordToken: String,
    resetPasswordExpires: Date,
    verificationToken: String,
    verificationExpires: {
      type: Date,
      default: () => new Date(+new Date() + 3 * 60 * 1000) //3 minutes
    },
    registrationConfirmed: {
      type: Boolean,
      default: false
    }
  }),
  google: {
    id: String,
    name: String,
    email: String
  },
  accountType: String
});

module.exports = mongoose.model("User", userSchema);

Zweitens können Sie den Index direkt auf mongodb erstellen.

Hier sind die Schritte, mit denen ich es zum Laufen bringen könnte:

1-) Entfernen Sie den indexbezogenen Code im Benutzerschema.

userSchema.index(
  { 'local.verificationExpires': 1 },
  {
    expireAfterSeconds: 0,
    partialFilterExpression: { 'local.registrationConfirmed': false }
  }
);

2-) Löschen Sie die Benutzersammlung (erwägen Sie ein Backup, wenn Sie keine Daten verlieren möchten)

3-) Erstellen Sie eine Benutzersammlung mit einer GUI wie MongoDB Compass.

4-) Erstellen Sie diesen Index in mongodb.

db.users.createIndex(
    { 'local.verificationExpires': 1 },
    {
        expireAfterSeconds: 0,
        partialFilterExpression: { 'local.registrationConfirmed': false }
    }
)

Dies wird etwa Folgendes ausgeben:

{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}

5-) Ich habe 2 Benutzer wie folgt erstellt:

{
    "_id" : ObjectId("5def4f0499dc104620a3310b"),
    "local" : {
        "registrationConfirmed" : false,
        "_id" : ObjectId("5def4f0499dc104620a3310c"),
        "email" : "[email protected]",
        "name" : "user2",
        "password" : "123123",
        "verificationExpires" : ISODate("2019-12-10T10:56:40.884+03:00")
    },
    "__v" : 0
}

{
    "_id" : ObjectId("5def4eff99dc104620a33109"),
    "local" : {
        "registrationConfirmed" : false,
        "_id" : ObjectId("5def4eff99dc104620a3310a"),
        "email" : "[email protected]",
        "name" : "user1",
        "password" : "123123",
        "verificationExpires" : ISODate("2019-12-10T10:56:35.385+03:00")
    },
    "__v" : 0
}

6-) Ich setze die Registrierung von Benutzer1 manuell auf true:

{
    "_id" : ObjectId("5def4eff99dc104620a33109"),
    "local" : {
        "registrationConfirmed" : true,
        "_id" : ObjectId("5def4eff99dc104620a3310a"),
        "email" : "[email protected]",
        "name" : "user1",
        "password" : "123123",
        "verificationExpires" : ISODate("2019-12-10T10:56:35.385+03:00")
    },
    "__v" : 0
}

7-) user2 wird nach ein paar Sekunden entfernt, wenn die Verifizierung abgelaufen ist.