sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur man tar bort overifierade användare med Mongoose och TTL

För det första tror jag att din schemadefinition inte är ett giltigt mongooseschema. Jag tog bort local.type.

Jag gav också verificationExpires-datumet ett standarddatum med ett utgångsdatum på 3 minuter, du kan ändra det värdet.

Så schemat måste vara så här:

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

För det andra kan du skapa indexet på mongodb direkt.

Här är stegen jag skulle kunna få det att fungera:

1-) Ta bort den indexrelaterade koden i användarschemat.

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

2-) Släpp användares insamling (överväg säkerhetskopiering om du inte vill förlora data)

3-) Skapa en användarsamling med hjälp av några gui som MongoDB Compass.

4-) Skapa detta index i mongodb.

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

Detta kommer att mata ut något så här:

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

5-) Jag skapade 2 användare så här:

{
    "_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-) Jag ställer manuellt in användar1s registreringBekräftad till sant:

{
    "_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-) användare2 tas bort efter några sekunder när verifieringen Expires passerat.




  1. Varför MongoDB olika frågeplaner visar olika nReturned värde?

  2. Meteor använda hämta eller hitta i mallhjälpfunktioner?

  3. Hur kan jag köra en JS-skriptfil från Pymongo?

  4. Lat lastning i MongoDB med NoRM