提问者:小点点

Mongoose当schema.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"
}

下面是UserSchema的一部分:

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

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


共1个答案

匿名用户

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

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