如何在MongoDB中删除多个关系文档?

时间:2020-04-05 17:04:57

标签: mongodb mongoose

帖子集

 Post : 
    _id : 001,
    comments : [1,2,3] // ObjectId

评论集

 Comment: 
    { _id : 1, message : "Bar" },
    { _id : 2, message : "Foo" },
    { _id : 3, message : "Bazz" }

我想删除一个帖子以及对此帖子的所有评论。但是如何删除其所有注释?

更新


PostSchema

{
    model: String,
    stock: Number,
    images: [String],
    price: Number,
    views: { type: Number, default: 1 },
    commentsCount: { type: Number, default: 0 },
    comments: [{ type: Schema.Types.ObjectId, ref: "postComments" }],
    postedBy: { type: String, ref: "publisherInfo" }
  },

postComments模式

{
    sender: String,
    createAt: { type: Date, default: Date.now },
    votes: { type: Number, default: 0 },
    contain: String
  },

2 个答案:

答案 0 :(得分:2)

您可以使用findByIdAndDelete删除该文档并返回它。 现在,我们可以动态创建一个注释id数组,并将其与deleteMany和$ in运算符一起使用。所以我们只使用了两个数据库访问。

router.delete("/posts/:id", async (req, res) => {
  try {
    const result = await Post.findByIdAndDelete(req.params.id);

    let commentIds = result.comments.map((c) => c._id);

    await Comment.deleteMany({
      _id: {
        $in: commentIds,
      },
    });

    res.send("OK");
  } catch (err) {
    console.log(err);
    res.status(500).send("Something went wrong");
  }
});

如果帖子已成功删除,但由于某种技术原因无法删除评论,则可以考虑使用transactions,以使操作成功或失败。

答案 1 :(得分:0)

这样,您可以安全地进行查询并删除所有注释。 如果您已经有ObjectId(id)格式的ID,请删除ObjectId

const Posts = db.collection('posts')
const Comments = db.collection('collection')
const postToBeDeleted = await Posts.findOne({_id: ObjectId('posts')})
if(postToBeDeleted){
    await Posts.deleteOne({_id: ObjectId('posts')}
    for(const comment of postToBeDeleted.comments)
        await Comments.deleteOne({_id: ObjectId(comment)})
}

相关问题