簡體   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