Как удалить потерянную ссылку на объект из коллекции пользователей? - PullRequest
0 голосов
/ 02 апреля 2020

Функция контроллера для поиска пользователя:

router.get("/:id", usersController.getUser)

getUser: async (req, res, next) => {
    try {
        const user = await User.findById(req.params.id)
        if (!user) {
            return res.status(404).json({ message: "User not found" })
        }
        return res.status(200).json({ user })
    } catch (error) {
        return next(error)
    }
}

И я получаю этот ответ:

{
    "user": [
        {
            "posts": [
                "5e857785591a6c1047341c60",
                "5e85779f591a6c1047341c61"
            ],
            "_id": "5e84e15ef2ae067df522c164",
            "username": "rick",
            "email": "rickk3@gmail.com",
            "password": "$2b$10$FRHysk3eBMEOfS3FAT1nEe9voFH9yETR.3V1ZTJkg8Ekwtt6TlJ.W",
            "createdAt": "2020-04-01T18:45:50.029Z",
            "updatedAt": "2020-04-02T05:26:55.722Z",
            "__v": 9
        }
    ]
}

router.delete("/:id/delete", postsController.deletePost)

Удаление функции пост-контроллера:

deletePost: async (req, res, next) => {
    try {
      const post = await Post.findByIdAndDelete(req.params.id)
      if (!post) {
        return res.status(200).json({ error: "No post found"})
      }
       res.status(200).json({ post })
    } catch(error) {
        console.log(error)
    }
  }

localhost:3000/api/v1/posts/5e857785591a6c1047341c60/delete

После удаления сообщения я получаю следующий ответ:

  {
    "post": {
        "_id": "5e857785591a6c1047341c60",
        "title": "helloooo",
        "description": "hello there",
        "user": "5e84e15ef2ae067df522c164",
        "createdAt": "2020-04-02T05:26:29.637Z",
        "updatedAt": "2020-04-02T05:26:29.637Z",
        "__v": 0
    }
}

Теперь после удаления сообщение, я хочу удалить ссылку ObjectID, которую имеет сообщение в коллекции users.

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

{
    "_id" : ObjectId("5e84e15ef2ae067df522c164"),
    "posts" :
        [
            ObjectId("5e857785591a6c1047341c60"),
            ObjectId("5e85779f591a6c1047341c61") 
        ],
        "username" : "rick",
        "email" : "rickk3@gmail.com",
        "password" : "$2b$10$FRHysk3eBMEOfS3FAT1nEe9voFH9yETR.3V1ZTJkg8Ekwtt6TlJ.W",
        "createdAt" : ISODate("2020-04-01T18:45:50.029Z"),
        "updatedAt" : ISODate("2020-04-02T05:26:55.722Z"),
        "__v" : 9
}

Ответы [ 2 ]

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

Поэтому после успешного удаления Post вызовите коллекцию user, чтобы извлечь этот конкретный идентификатор записи из массива posts.

Попробуйте следующий код:

const mongoose = require("mongoose");

deletePost: async (req, res, next) => {
  try {
    const post = await Post.findByIdAndDelete(req.params.id);
    if (!post) {
      return res.status(200).json({ error: "No post found" });
    }
    await User.update(
      { _id: mongoose.Types.ObjectId(post.user) },
      { $pull: { "posts": mongoose.Types.ObjectId(post._id) } }
    ); /** You can check for n updated to make sure this operation is successful or else can re-try again */
    res.status(200).json({ post });
  } catch (error) {
    console.log(error);
  }
};
0 голосов
/ 02 апреля 2020

, используя пн goose просто https://mongoosejs.com/docs/api/model.html#model_Model .findByIdAndDelete

  var users = require('../Models/User.model');
    users.findOneAndRemove({ _id: req.params.id }, function (err) {
        if (err) {
            console.log("when delete account Encountered an error !");
        }

        res.redirect('/Account/index');
    });

.. / Models / User.model. js пример

var mongoose = require('mongoose');

var Schema = mongoose.Schema;

var usersSchema = new Schema({
    username: { type: String, required: true/* , unique: true */ },
    password: { type: String, required: true },
    date: { type: Date, default: Date.now }

});

var users = mongoose.model('users', usersSchema);
module.exports = users;
...