Mongoengine update_one + upsert与弃用的get_or_create

时间:2014-07-14 14:15:22

标签: python mongodb mongoengine

假设我有一组用MongoEngine定义的文档:

class Project(Document):
    name = StringField(required=True)
    client = StringField(required=True)
    code = StringField(required=True,unique=True)
    created = DateTimeField(required=True,default=datetime.datetime.now)

从历史上看,我本可以使用get_or_create方法执行“插入或更新”类型的操作。例如:

Project.objects().get_or_create(name="Test Project One",
                                client="Client One",
                                code="CL1-001")

将以下文档添加到集合中:

{
    "name": "Test Project One",
    "client": "Client One",
    "code": "CL1-001",
    "created": {
        "$date": "2014-07-14T14:00:38.024Z"
    }
}

现在这个方法has been depreciated recommend alternativeupdate_one使用upsert=True,如下所示:

Project.objects(code="CL1-002").update_one(set__name="Test Project Two",
                                           set__client="Client One",
                                           upsert=True)

但是这导致文档被添加到没有created字段的集合中:

{
    "client": "Client One",
    "code": "CL1-002",
    "name": "Test Project Two"
}

有没有办法在没有竞争条件的情况下使用MongoEngine复制get_or_create默认字段行为?

1 个答案:

答案 0 :(得分:9)

目前不支持此功能,但可能是 - 请添加一张票,维护人员可以查看。

与此同时,您可以使用$setOnInsert,只会在插入时设置一个值,并且会复制所需的内容,例如:

Project.objects(code="CL1-002").update_one(set_on_insert__created=Project().created,
                                           set__name="Test Project Two",
                                           set__client="Client One",
                                           upsert=True)