sql >> データベース >  >> NoSQL >> MongoDB

MongooseとTTLを使用して未確認のユーザーを削除する方法

    まず、あなたのスキーマ定義は有効なマングーススキーマではないと思います。local.typeを削除しました。

    また、verificationExpiresの日付を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-)MongoDBCompassなどのGUIを使用してユーザーコレクションを作成します。

    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のregistrationConfirmedを手動で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. マングースを使用してサブドキュメントを直接クエリすることは可能ですか?

    2. mongodbでgroupbyを使用してMax()を選択します

    3. .quit()を使用してノードredisクライアントインスタンスを終了する必要がありますか?

    4. 配列を並べ替えて、MongoDBにランクフィールドを追加します