MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как да премахнете непроверен потребител с Mongoose и TTL

Първо, мисля, че вашата дефиниция на схема не е валидна схема на mongoose. Премахнах local.type.

Също така дадох на verificationExpires date дата по подразбиране с изтичане от 3 минути, можете да промените тази стойност.

Така че схемата трябва да е така:

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

Второ, можете да създадете индекса на mongodb директно.

Ето стъпките, с които мога да го накарам да работи:

1-) Премахнете свързания с индекса код в потребителската схема.

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

2-) Премахнете колекцията от потребители (помислете за архивиране, ако не искате да загубите данни)

3-) Създайте потребителска колекция, като използвате графичен интерфейс като MongoDB Compass.

4-) Създайте този индекс в mongodb.

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

Това ще изведе нещо подобно:

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

5-) Създадох 2 потребители по този начин:

{
    "_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-) Зададох ръчно регистрацията на user1 Confirmed на 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 се премахва след няколко секунди, когато verificationExpires премине.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. i18Next - NodeJS - Как да промените преводите без презареждане на сървъра

  2. Удостоверяване по време на свързване към сървър на MongoDB с помощта на Java

  3. $unset за множество полета в mongodb

  4. Какъв би бил еквивалентът на MongoDB C# драйвера на следната заявка, използваща оператора за актуализиране на масив $[<identifier>]

  5. Компресирайте (съкратете) PHP низ от 24 знака на 20