当schema.index过期时,猫鼬删除所有子文档

时间:2020-07-14 14:37:03

标签: node.js mongodb mongoose 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"
}

这是用户方案的一部分:

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 个答案:

答案 0 :(得分:0)

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

  1. 仅在确认用户后创建工作区。
  2. 直接在用户内嵌入工作区。没有项目的更多细节,很难说这是否可行。
  3. 手动删除“已过期”的用户,而无需在重复后台作业时使用过期索引。