繁体   English   中英

ZCCADCDEDB567ABAE643E15DCF0974E503Z:使用 deleteMany 挂钩删除引用的 ObjectId

[英]Mongoose: Remove referencing ObjectIds using deleteMany hook

我的架构如下所示:

const Author = new Schema({
    name: String,
    posts: [{ type: mongoose.Schema.Types.ObjectId, ref: "Post" }]
});

const Post = new Schema({
    text: String,
    author: { type: mongoose.Schema.Types.ObjectId, ref: "Author" }
});

如果我使用deleteMany()删除一堆帖子,从作者的 object 中删除 ObjectId 条目的最佳方法是什么?

我尝试使用deleteMany预挂钩,但是它只传递删除了多少文档,而不传递帖子的实际 ObjectId。

您可以创建用于 deleteMany 的查询deleteMany ,而是使用它通过find查询文档。 这将为您提供所有目标文档,然后您可以通过deleteMany将其删除。

之后,如果删除的计数与获取的文档的长度相匹配,那么您可以安全地从作者那里删除所有内容。 如果删除的总数与获取文档的长度不匹配,那么您可以遍历所有最初获取的文档,尝试获取它,如果未找到,则意味着它已被删除,您可以安全地从作者中删除。

typescript 中的示例:

  const queryObj = { foo: 'bar' };
  const postsCollection = mongoDb.getCollection<{ _id: ObjectId }>('posts');
  const postsToDelete = await postsCollection.find(queryObj).toArray();
  const deleteManyResult = await postsCollection.deleteMany(queryObj);

  if (deleteManyResult.deletedCount === postsToDelete.length) {
    for (const deletedPost of postsToDelete) {
      // delete from author
    }
  } else {
    for (const potentiallyDeletedPost of postsToDelete) {
      const post = await postsCollection.findOne({ _id: potentiallyDeletedPost._id });
      if (!post) {
        // delete from author
      } else {
        // handle non-deleted post
      }
    }
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM