Невозможно удалить Mon goose Document с помощью Mon goose Middleware - PullRequest
0 голосов
/ 16 апреля 2020

Я использую Typescript + Mon goose + GraphQL, который имеет следующий дизайн

  • Пользователь
    • Задачи
      • Комментарии

Я пытаюсь написать промежуточное ПО mon goose, которое поможет мне удалить комментарии, относящиеся к конкретной задаче, если я удалю указанную c задачу

В настоящее время я могу удалить заданную задачу c, вызвав findByIdAndRemove, однако мое промежуточное ПО mon goose не работает, поскольку не «каскадно» удаляет комментарии, относящиеся к указанной задаче c. Я удалил

Может кто-нибудь помочь указать, где я ошибся? Спасибо

Ниже представлены мои модели

Задача

import { Document, Schema, model, Types } from "mongoose";

const taskSchema = new Schema(
  {
    name: {
      type: String,
      required: true,
    },
    completed: {
      type: Boolean,
      default: false,
      required: true,
    },
    comments: [
      {
        type: Schema.Types.ObjectId,
        ref: "Comment",
      },
    ],
    user: {
      type: Schema.Types.ObjectId,
      ref: "User",
    },
  },
  {
    timestamps: true,
  }
);

interface ITaskSchema extends Document {
  name: string;
  completed: boolean;
  comments: Types.Array<Object>;
  user: Types.ObjectId;
}

taskSchema.pre<ITaskSchema>("remove", function (next) {
  const Comment = model("Comment");
  Comment.remove({ _id: { $in: this.comments } }).then(() => next());
});

const Task = model<ITaskSchema>("Task", taskSchema);

export default Task;

Комментарий

import * as mongoose from "mongoose";

const Schema = mongoose.Schema;

const commentSchema = new Schema(
  {
    review: {
      type: String,
      required: true,
    },
    task: {
      type: Schema.Types.ObjectId,
      ref: "Task",
    },
    user: {
      type: Schema.Types.ObjectId,
      ref: "User",
    },
  },
  {
    timestamps: true,
  }
);

const Comment = mongoose.model("Comment", commentSchema);

export default Comment;

Пользователь

import * as mongoose from "mongoose";

import hobbySchema from "./Hobby";

const Schema = mongoose.Schema;

const userSchema = new Schema(
  {
    name: {
      type: String,
    },
    email: {
      type: String,
      required: true,
    },
    password: {
      type: String,
    },
    hobbies: [hobbySchema],
    tasks: [
      {
        type: Schema.Types.ObjectId,
        ref: "Task",
      },
    ],
  },
  {
    timestamps: true,
  }
);

const User = mongoose.model("User", userSchema);

export default User;

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Обратитесь к документам , findByIdAndRemove, просто запускайте findOneAndRemove() промежуточное ПО, поэтому вам нужно изменить промежуточное ПО на findOneAndRemove. Но findOneAndRemove - это промежуточное ПО запроса , поэтому this в функции промежуточного ПО относится к запросу, а не к документу. Чтобы это работало, вам нужно внести некоторые изменения:

  1. Использовать промежуточное ПО findOneAndRemove.
  2. Использовать post вместо pre, поскольку с помощью pre вы можете не получить do c.
  3. Передать еще один параметр, относящийся к do c, к функции.

Окончательный код будет выглядеть следующим образом:

taskSchema.post<ITaskSchema>("findOneAndRemove", function (task, next) {
  const Comment = model("Comment");
  Comment.remove({ _id: { $in: task.comments } }).then(() => next());
});
0 голосов
/ 16 апреля 2020

Кредиты и большое спасибо Cuong Le N goc, теперь он может отлично работать! Ниже приведен окончательный код промежуточного ПО

taskSchema.post<ITaskSchema>("findOneAndRemove", async function (task, next) {
  const Comment = model("Comment");
  const User = model("User");
  await User.updateMany({ tasks: task._id }, { $pull: { tasks: task._id } });
  await Comment.remove({ _id: { $in: task.comments } });
  next();
});
.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...