sql >> Database >  >> NoSQL >> MongoDB

Hoe een niet-geverifieerde gebruiker te verwijderen met Mongoose en TTL

Ten eerste denk ik dat je schemadefinitie geen geldig mangoestschema is. Ik heb het local.type verwijderd.

Ook heb ik de verificatie Vervaldatum een ​​standaarddatum gegeven met een vervaldatum van 3 minuten, je kunt die waarde wijzigen.

Dus het schema moet als volgt zijn:

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

Ten tweede kunt u de index rechtstreeks op mongodb maken.

Dit zijn de stappen waarmee ik het kan laten werken:

1-) Verwijder de indexgerelateerde code in het gebruikersschema.

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

2-) Verwijder gebruikersverzameling (overweeg een back-up te maken als u geen gegevens wilt verliezen)

3-) Maak een gebruikersverzameling met behulp van een gui zoals MongoDB Compass.

4-) Maak deze index in mongodb.

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

Dit zal zoiets als dit opleveren:

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

5-) Ik heb 2 gebruikers als volgt aangemaakt:

{
    "_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) Ik heb de registratie van gebruiker1 handmatig ingesteld op 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 wordt na een paar seconden verwijderd wanneer de verificatie verloopt.




  1. mongoDB:een object-ID maken voor elk nieuw kind dat aan het array-veld wordt toegevoegd

  2. MongoDB:voeg documenten in met een specifieke id in plaats van automatisch gegenereerde ObjectID

  3. Is Redis slechts een cache?

  4. Bulk invoegen in MongoDB met behulp van mangoest