[英]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.