Пн goose по истечении срока действия schema.index удалить все вложенные документы - PullRequest
0 голосов
/ 14 июля 2020

Главный вопрос: Как я могу удалить вложенные документы по истечении срока действия документа? (с помощью метода mon goose 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 голосов
/ 14 июля 2020

MongoDB не поддерживает внешние ключи и не имеет ничего похожего на каскадное удаление. У вас есть как минимум три варианта:

  1. Создавать рабочие пространства только после подтверждения пользователя.
  2. Встраивать рабочие пространства напрямую в пользователей. Трудно сказать, жизнеспособно ли это, не имея более подробной информации о вашем проекте.
  3. Удалять "просроченных" пользователей вручную без устаревшего индекса при повторении фонового задания.
...