mongodb - 如何删除MongoDB中的多个关系文档?

标签 mongodb mongoose

帖子收藏

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

评论收藏

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

我想删除帖子以及该帖子的所有评论。但如何删除其所有评论呢?

更新


后架构

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

最佳答案

您可以使用 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以便操作要么成功,要么失败。

关于mongodb - 如何删除MongoDB中的多个关系文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61046295/

相关文章:

node.js - 是否需要在nodejs中关闭mongodb连接?

javascript - 分配给另一个变量后数据发生变化

node.js - 如何将当前时间戳放入 Mongoose Schema?

javascript - Mongoose 回调抛出异常

javascript - 表达 Mongoose 在找到后在 View 上显示数据

node.js - 链接 promise 更新 Mongoose 中的引用文档

MongoDB docker 容器 "Failed to unlink socket file"

node.js - 使用 Angular 和 Nodejs 将文件保存到 mongodb

node.js - Mongoose 有 isDirty 检查吗?

ssl - 如何在带有 SSL 的 Mongoose 嵌入式 Web 服务器上使用 http websocket?