【问题标题】:How to delete many relational document in MongoDB?如何删除MongoDB中的许多关系文档?
【发布时间】:2020-07-17 15:41:52
【问题描述】:

发布收藏

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

评论收集

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

我想删除一个帖子和该帖子上的所有 cmets。但是如何删除它的所有 cmets 呢?

更新


后模式
{
    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
  },

【问题讨论】:

  • 为了轻松应对这种情况,最好在子文档中保留一个父引用,我的意思是评论中的 postId。您可以将您的帖子和评论架构代码添加到问题中吗?
  • yaa。但我认为无论出于何种原因,它都是无用的数据(PostId),每个文档都会包含它。我认为有一些解决方案。所以我发布了这个问题。
  • 你能添加帖子和评论架构吗?
  • 当然...我也会添加这些架构

标签: mongodb mongoose


【解决方案1】:

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

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

如果帖子删除成功,但由于技术原因无法删除cmets,可以考虑使用transactions,这样操作成功或失败。

【讨论】:

    【解决方案2】:

    这样您就可以安全地查询并删除所有 cmets。 如果您已经在 ObjectId 表单中拥有 id,请删除 ObjectId(id)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-29
      • 1970-01-01
      • 2012-07-03
      • 1970-01-01
      • 2021-11-18
      • 2011-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多