1

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

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

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

4

1 回答 1

4

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

你应该使用ListFieldwith ReferenceFieldsReferenceFields可以与选项reverse_delete_rule=mongoengine.PULL或其他一起使用:

mongoengine.DO_NOTHING 这是默认设置,不会做任何事情。删除速度很快,但可能会导致数据库不一致或悬空引用。

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

mongoengine.NULLIFY 仍然引用被删除对象的任何对象字段都将被删除(使用 MongoDB 的“<a href="http://docs.mongodb.org/manual/reference/operator/unset/" rel="nofollow">unset ”操作),有效地使关系无效。

mongoengine.CASCADE 任何包含引用被删除对象的字段的对象都将首先被删除。

mongoengine.PULL 从任何对象的 ListField (ReferenceField) 字段中移除对对象的引用(使用 MongoDB 的“拉”操作)。

于 2013-06-23T23:00:42.097 回答