如何从mongo数据库中完全删除文档的子文档

时间:2019-07-30 21:01:20

标签: javascript node.js mongoose

我正在尝试删除一个mongodb对象,然后将其删除后,我想删除与该mongodb对象相关的所有内容。包括我的mongo数据库中的嵌套mongodb对象。

var parentObjectSchema = new mongoose.Schema({
    name: String,
    split: Number,
    parts: [
        {
            type: mongoose.Schema.Types.ObjectId,
            ref: "ChildObjectSchema"
        }
    ],
});

var childObjectSchema = new mongoose.Schema({
    name: String,
    number: Number,
    things: [
      {
         type: mongoose.Schema.Types.ObjectId,
         ref: "Things"
      }
   ],
});

因此,我试图删除parentObject以及随之而来的childObjects。不知道我该怎么做。我成功删除了parentObject,但是childObject仍然在mongodb中,占用了空间。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

MongoDB不像其他数据库那样提供外键的概念。 Mongoose在客户端库中具有便捷的方法,该方法使用多个查询并结合结果将您的文档与其他文档一起填充:

https://mongoosejs.com/docs/populate.html

如果要进行级联删除,则需要在要删除的父级文档中获取子级的对象ID,然后对这些子级文档执行删除。

这是一个简化的示例:

const deleteThing = (thingId) => {
  thingObjectSchema.remove({ _id: thingId });
};

const deleteChild = (childId) => {
  childObjectSchema.findOne({ _id: childId }).select('things').lean().exec((err, child) => {
    for (const thingId of child.things) {
      deleteThing(thingId);
    }

    childObjectSchema.remove({ _id: childId });
  })
};

const deleteParent = (parentId) => {
  parentObjectSchema.findOne({ _id: parentId }).select('parts').lean().exec((err, parent) => {
    for (const childId of parent.parts) {
      deleteChild(childId);
    }

    parentObjectSchema.remove({ _id: parentId });
  })
};

// note: not actually tested