【问题标题】:Mongoose when schema.index expires delete all subdocuments当 schema.index 过期时 Mongoose 删除所有子文档
【发布时间】:2020-07-14 14:37:03
【问题描述】:

主要问题:如何在文档过期时删除子文档? (使用猫鼬 index() 方法)

详情:

当用户注册后,后端会为他们创建工作区和项目。

{
    *user fields*
    "workspaces": [
        {
            "owner": "5f0dc0a6fefaaf1040796f21",
            "projects": [
                {
                    "owner": "5f0dc0a6fefaaf1040796f21",
                    "workspace": "5f0dc0a6fefaaf1040796f22",
                    "title": "EXAMPLE PROJECT",
                    "id": "5f0dc0a6fefaaf1040796f24"
                }
            ],
            "title": "Personal",
            "id": "5f0dc0a6fefaaf1040796f22"
        },
        {
            "owner": "5f0dc0a6fefaaf1040796f21",
            "projects": [],
            "title": "Shared with me",
            "id": "5f0dc0a6fefaaf1040796f23"
        }
    ],
    "id": "5f0dc0a6fefaaf1040796f21"
}

这是用户模式的一部分:

const UserSchema = new Schema({
  workspaces : [{ type: Schema.Types.ObjectId, ref: 'Workspace' }],
  confirmed: {
    type: Boolean,
    default: false
  },
  confirmToken: {
    type: String,
    default: ''
  },
  confirmTokenExpires: {
    type: Date,
    default: () => new Date(+new Date() + 60 * 60 * 1000) //60 minutes
  }, *more fields
});

用户有 1 小时的时间来确认他们的电子邮件地址,在此之后用户应该连同子文档一起被删除。用户现在删除了,但子文档没有。

UserSchema.index(
  { 'confirmTokenExpires': 1 },
  {
      expireAfterSeconds: 0,
      partialFilterExpression: { 'confirmed': false }
  }
)

我试图找到一个解决方案,但我在这里,希望 :) 提前致谢!

【问题讨论】:

    标签: node.js mongodb mongoose mongoose-schema


    【解决方案1】:

    MongoDB 不支持外键,也没有类似于级联删除的功能。您至少有三个选择:

    1. 只有在用户确认后才能创建工作区。
    2. 直接在用户中嵌入工作区。如果没有关于您的项目的更多详细信息,很难判断这是否可行。
    3. 在重复后台作业中手动删除“过期”用户,而没有过期索引。

    【讨论】:

    • 非常感谢! :) 我会尝试其中一种选择。很高兴知道,猫鼬没有这样的东西。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 2017-09-28
    • 2020-12-29
    • 2023-02-11
    • 2019-06-05
    • 2016-05-06
    • 2014-12-02
    相关资源
    最近更新 更多