如何从用户集合中删除孤立的 objectid 引用?

How to delete orphaned objectid reference from the users collection?

查找用户的控制器函数:

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": "b$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)

正在删除一个 post 控制器函数:

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 后,我得到了这样的回复:

  {
    "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
    }
}

现在,在删除 post 后,我希望删除 post 在 users 集合中的 ObjectID 引用。

现在,在数据库中,用户文档如下所示:

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

因此,在您成功删除 Post 后,调用 user 集合以从 posts 数组中提取特定的 post id。

试试下面的代码:

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);
  }
};

轻松使用猫鼬 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;