sql >> Databáze >  >> NoSQL >> MongoDB

Jak odstranit neověřeného uživatele pomocí Mongoose a TTL

Zaprvé si myslím, že vaše definice schématu není platné schema mongoose. Odstranil jsem local.type.

Také jsem dal datum ověřeníExpires výchozí datum s vypršením 3 minut, tuto hodnotu můžete změnit.

Schéma tedy musí být takovéto:

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

Za druhé, můžete vytvořit index přímo na mongodb.

Zde jsou kroky, jak by to mohlo fungovat:

1-) Odstraňte kód související s indexem v uživatelském schématu.

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

2-) Zrušte shromažďování uživatelů (pokud nechcete přijít o data, zvažte zálohování)

3-) Vytvořte sbírku uživatelů pomocí nějakého grafického rozhraní, jako je MongoDB Compass.

4-) Vytvořte tento index v mongodb.

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

Výsledkem bude něco takového:

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

5-) Vytvořil jsem 2 uživatele takto:

{
    "_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-) Ručně jsem nastavil registraci uživatele1 Potvrzeno na 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-) uživatel2 je odstraněn po několika sekundách po vypršení platnosti ověření.




  1. Jak převést řetězec se znaky v int pro celou kolekci?

  2. BadYieldError při použití motoru find() [MongoDB + Tornado]

  3. jak předat proměnnou regulárnímu výrazu

  4. Problém řízení toku pomocí uzlu/redis a zpětných volání?