Ste*_*ter 5 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)
Run Code Online (Sandbox Code Playgroud)
从历史上看,我可以使用该get_or_create方法执行"插入或更新"类型的操作.例如:
Project.objects().get_or_create(name="Test Project One",
client="Client One",
code="CL1-001")
Run Code Online (Sandbox Code Playgroud)
其中将以下文档添加到集合中:
{
"name": "Test Project One",
"client": "Client One",
"code": "CL1-001",
"created": {
"$date": "2014-07-14T14:00:38.024Z"
}
}
Run Code Online (Sandbox Code Playgroud)
现在,这种方法现在已经贬值了建议的替代方法是使用update_one具有upsert=True如下:
Project.objects(code="CL1-002").update_one(set__name="Test Project Two",
set__client="Client One",
upsert=True)
Run Code Online (Sandbox Code Playgroud)
但这导致文档被添加到集合中而没有created字段:
{
"client": "Client One",
"code": "CL1-002",
"name": "Test Project Two"
}
Run Code Online (Sandbox Code Playgroud)
是否有任何方法可以在get_or_create没有竞争条件的情况下使用MongoEngine 复制默认字段行为?
目前这不会自动支持,但可能是 - 请添加一张票,维护人员可以查看.
在此期间,您可以使用$ 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)
Run Code Online (Sandbox Code Playgroud)