python - 从 ListField 中删除带有 FileField 的 EmbeddedDocument

标签 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})

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

最佳答案

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

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

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

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

mongoengine.NULLIFY 仍然引用被删除对象的任何对象字段都将被删除(使用 MongoDB 的“unset”操作),从而有效地取消关系。

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

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

关于python - 从 ListField 中删除带有 FileField 的 EmbeddedDocument,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17257345/

相关文章:

python - vlc python 绑定(bind) - 如何接收键盘输入?

Python RegEx 缺少括号错误

javascript - MongoDb:在父级保存中查找插入的子级的生成 ID

node.js - MongoError : ns not found when try to drop collection

python - 使用 MongoDB,如何根据匹配项从列表中删除嵌入的文档

django - 计算 mongoengine ListField 元素

python - Mongoengine Transactions怎么来的?

python - 将 Argparse 与 Google Admin API 结合使用

python - Scrapy安装: no acceptable C compiler found in $PATH

java - 如何使用 Morphia 将对象集合保存到 MongoDB?