【问题标题】:Mongoengine update_one+upsert vs. deprecated get_or_createMongoengine update_one+upsert 与不推荐使用的 get_or_create
【发布时间】:2014-09-04 11:49:15
【问题描述】:

假设我有一个用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 depreciatedrecommend alternative这个方法是使用update_oneupsert=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 默认字段行为?

【问题讨论】:

    标签: python mongodb mongoengine


    【解决方案1】:

    目前不自动支持此功能,但可以 - 请添加工单,维护人员可以查看。

    与此同时,您可以使用$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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-07
      • 2017-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-06
      • 2016-04-22
      相关资源
      最近更新 更多