具有唯一索引的Mongoengine中的Upsert操作

问题描述

我正在使用mongoengine版本0.20.0

我有一个文档,该文档的属性为EmbeddedDocuments类型和ReferenceField,该文档在EmbeddedDocuments的属性上也具有唯一索引。

作为我的应用程序的一部分,我需要能够对文档执行upsert操作,

我尝试将document.save()操作与force_insert = False一起使用,但是仍然给我DuplicatKeyError / NotUniqueKeyError

我尝试使用

document.modify(query={"class_1": class_1},**document.to_mongo().to_dict(),upsert=True) 

但是这给了我一个错误,那就是引用字段必须是类型

mongoengine.errors.ValidationError: A ReferenceField only accepts DBRef,LazyReference,ObjectId or documents

“收集模式”如下。

class Class_1(EmbeddedDocument):
    attr_1 = StringField()
    attr_2 = StringField()

class Class_2(Document):
    Meta = {"collection": "class_2"}

    attr_1 = StringField()
    attr_2 = IntField()
    

class class_3(Document):
    Meta = {
        "collection": "class_3","indexes": [
            {
                "fields": ["class_1.attr_1","class_1.attr_2"],"unique": True,"name": "unique_index",}
        ]
    }

    class_1 = EmbeddedDocumentField(Class_1)
    class_2 = ReferenceField("Class_2")

想知道是否有一种更简单的方法来对mongoengine文档进行upsert操作。

理想情况下,我正在寻找一种方式来更新整个文档,而不必指定需要更新的每个单独字段,作为我的应用程序的一部分,我将始终仅具有完整的文档更新。 / strong>

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...