Как удалить ссылочный документ в одной коллекции и его запись из другой упомянутой коллекции - PullRequest
0 голосов
/ 07 февраля 2020

В моих NodeJS API и MongoDB я пытаюсь удалить запись, которая является ссылкой на другую коллекцию. Что я хотел бы сделать, это удалить указанный objectId и записи, относящиеся к другой коллекции, на которую ссылаются.

У меня 2 модели Профилей и сообщений, и я хочу удалить одно и то же сообщение из коллекции профилей и сообщений. Мне удалось удалить идентификатор ссылки в профиле, но я не знаю, как удалить также запись из коллекции сообщений.

Я пробовал это:

async delete(req, res) {
        try {
            // Match with username and pull to remove
            await Profile.findOneAndUpdate(
                { _id: res.id._id },
                { $pull: { posts: req.params.postId } },
                err => {
                    if (err) {
                        throw new ErrorHandlers.ErrorHandler(500, err);
                    }
                    res.json({ Message: "Deleted" });
                }
            );
        } catch (error) {
            res.status(500).send(error);
        }
    } 

И мои 2 модели:

// Here defining profile model
// Embedded we have the Experience as []
const { Connect } = require("../db");
const { isEmail } = require("validator");

const postSchema = {
    type: Connect.Schema.Types.ObjectId,
    ref: "Post"
};

const experienceSchema = {
    role: {
        type: String,
        required: true
    },
    company: {
        type: String,
        required: true
    },
    startDate: {
        type: Date,
        required: true
    },
    endDate: {
        type: Date,
        required: false
    },
    description: {
        type: String,
        required: false
    },

    area: {
        type: String,
        required: true
    },
    createdAt: {
        type: Date,
        default: Date.now,
        required: false
    },

    updatedAt: {
        type: Date,
        default: Date.now,
        required: false
    },

    username: {
        type: String,
        required: false
    },
    image: {
        type: String,
        required: false,
        default: "https://via.placeholder.com/150"
    }
};

const profileSchema = {
    firstname: {
        type: String,
        required: true
    },

    surname: {
        type: String,
        required: true
    },

    email: {
        type: String,
        trim: true,
        lowercase: true,
        unique: true,
        required: [true, "Email is required"],
        validate: {
            validator: string => isEmail(string),
            message: "Provided email is invalid"
        }
    },

    bio: {
        type: String,
        required: true
    },

    title: {
        type: String,
        required: true
    },

    area: {
        type: String,
        required: true
    },

    imageUrl: {
        type: String,
        required: false,
        default: "https://via.placeholder.com/150"
    },

    username: {
        type: String,
        required: true,
        unique: true
    },

    experience: [experienceSchema],
    posts: [postSchema],

    createdAt: {
        type: Date,
        default: Date.now,
        required: false
    },

    updatedAt: {
        type: Date,
        default: Date.now,
        required: false
    }
};



const collectionName = "profile";
const profileSchemaModel = Connect.Schema(profileSchema);
const Profile = Connect.model(collectionName, profileSchemaModel);

module.exports = Profile;

const { Connect } = require("../db");

const reactionSchema = {
    likedBy: {
        type: String,
        unique: true,
        sparse: true
    }
};

const postSchema = {
    text: {
        type: String,
        required: true,
        unique: true,
        sparse: false
    },

    profile: {
        type: Connect.Schema.Types.ObjectId,
        ref: "Profile",
    },

    image: {
        type: String,
        default: "https://via.placeholder.com/150",
        required: false
    },
    createdAt: {
        type: Date,
        default: Date.now,
        required: false
    },

    updatedAt: {
        type: Date,
        default: Date.now,
        required: false
    },

    reactions: [reactionSchema],

    comments: {
        type: Connect.Schema.Types.ObjectId,
        ref: "Comment",
        required: false
    }
};

const collectionName = "post";
const postSchemaModel = Connect.Schema(postSchema);
const Post = Connect.model(collectionName, postSchemaModel);

module.exports = Post;

1 Ответ

1 голос
/ 07 февраля 2020

Просто добавьте запрос, чтобы удалить сообщение после извлечения его идентификатора из коллекции профилей:

async delete(req, res) {
  try {
      // Match with username and pull to remove
      await Profile.findOneAndUpdate(
          { _id: res.id._id },
          { $pull: { posts: req.params.postId } },
          // You don't need an error callback here since you are 
          // using async/await. Handle the error in the catch block.
      );
      await Posts.remove({ _id: req.params.postId });
  } catch (error) {
      // This is where you handle the error
      res.status(500).send(error);
  }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...