使用ListField中的FileField删除EmbeddedDocument

时间:2013-06-23 02:57:27

标签: python mongodb mongoengine listfield

在MongoEngine中,从包含FileField的ListField中删除EmbeddedDocument时,不会删除引用的文件。目前,我已经通过循环整个列表字段解决了这个问题。

for embdoc in doc.embdocs:
    if embdoc.filtered == value:
        embdoc.dfile.delete()
doc.update(pull__embdocs={'filtered': value})

我想知道是否有更好的方法来做到这一点。

1 个答案:

答案 0 :(得分:2)

默认情况下,MongoDB不会检查数据的完整性,因此删除其他文档仍然引用的文档会导致一致性问题。

您应该将ListFieldReferenceFields一起使用。 ReferenceFields可以与选项reverse_delete_rule=mongoengine.PULL或其他选项一起使用:

<强> mongoengine.DO_NOTHING 这是默认设置,不会执行任何操作。删除速度很快,但可能导致数据库不一致或悬空引用。

<强> mongoengine.DENY 如果仍然存在对要删除的对象的引用,则删除将被拒绝。

<强> mongoengine.NULLIFY 删除任何仍然引用被删除对象的对象字段(使用MongoDB的“unset”操作),有效地使关系无效。

<强> mongoengine.CASCADE 将首先删除包含引用要删除的对象的字段的任何对象。

<强> mongoengine.PULL 从ListField(ReferenceField)的任何对象的字段中删除对象的引用(使用MongoDB的“pull”操作)。