猫鼬:使用deleteMany钩子删除引用的ObjectIds

我的架构如下:

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。

wenweiflytop 回答:猫鼬:使用deleteMany钩子删除引用的ObjectIds

您可以创建用于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
      }
    }
  }
本文链接:https://www.f2er.com/3164075.html

大家都在问