我的架构如下:
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()
删除一堆帖子,从作者对象中删除ObjectId条目的最佳方法是什么?
我尝试使用deleteMany
前置钩,但是它仅传递删除了多少文档,而不传递帖子的实际ObjectId。
答案 0 :(得分:0)
您可以创建用于deleteMany
的查询对象,而改为使用find
来查询文档。这将为您提供所有目标文档,然后您可以通过deleteMany
删除它们。
此后,如果删除的计数与获取的文档的长度匹配,则可以安全地将所有内容从作者中删除。如果删除的总数与获取的文档的长度不匹配,则可以遍历所有最初获取的文档,尝试获取它,如果找不到,则表示已删除,可以放心地从作者中删除。>
打字稿示例:
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
}
}
}