[英]Mongoose deleteMany in pre-hook, how to access all documents that will be deleted?
[英]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.