如果不使用 mongoengine (python),我该如何更新(如果存在)和插入(如果存在)
How do I update if exist and insert if not using mongoengine (python)
mongoengine 有如此神秘的文档真是荒谬。我正在尝试基于几个 columns/fields 做一个简单的(如果存在查询则更新)。我的意思是
if fieldA has valueA and
fieldB has valueB and
fieldC has valueC
then
update fieldD with newValueD,
fieldE with newValueE
我可以用下面提到的方法来做,但我很确定有一个非常简单的更新插入语法,如果我提到字段和值,它就会在整个集合中匹配它,如果匹配则更新,如果匹配则插入不要
def __generateRemoteData(data):
"""
Utils function to add remote data to Mongo
"""
for datum in data:
query = RemoteGraph.objects(
Q(fieldA=datum.get('fieldA')) and
Q(fieldB=datum.get('fieldB')) and
Q(fieldC=datum.get('fieldC')) and
Q(fieldD=datum.get('fieldD')) and
Q(fieldE=datum.get('fieldE')) and
Q(date=datum.get('date'))
)
if not query:
RemoteGraph(
fieldA=datum.get('fieldA'),
fieldB=datum.get('fieldB'),
fieldC=datum.get('fieldC'),
fieldD=datum.get('fieldD'),
fieldE=datum.get('fieldE'),
date=datum.get('date'),
fieldF=datum.get('fieldF'),
fieldG=datum.get('fieldG'),
).save()
else:
query.update(
set__fieldF=datum.get('fieldF'),
set__fieldG=datum.get('fieldG'),
)
正在寻找一种更像 Python 的方法来做到这一点。
我调查了 upsert
、insert
、modify
、save
、update
、update_one
首先,Q() 仅与按位运算符组合。而 Q 的意义在于组合 &
和 |
运算符。详细here
QuerySet::update
方法有一个特殊选项upsert=True
。 Upsert – 如果 RemoteGraph.objects(a=val_a, b=val_b, c=val_c, date=date)
找不到任何文档,则强制插入新文档。
RemoteGraph.objects(
a=val_a, b=val_b, c=val_c, date=date
).update(
a=val_a, b=val_b, c=val_c, date=date
)
还有[QuerySet::modify][3]
和QuerySet::update_one
方法,他们也可以插入新文档,但不像QuerySet::update
,他们会更新只有 QuerySet
.
的第一个文档
最后还有 QuerySet::upsert_one
。这个名字说明了一切。一个明显的区别是,如果 QuerySet 包含多个文档,它会引发异常。实际上 QuerySet::update_one
和 QuerySet::upsert_one
是 QuerySet::update
的小包装
mongoengine 有如此神秘的文档真是荒谬。我正在尝试基于几个 columns/fields 做一个简单的(如果存在查询则更新)。我的意思是
if fieldA has valueA and
fieldB has valueB and
fieldC has valueC
then
update fieldD with newValueD,
fieldE with newValueE
我可以用下面提到的方法来做,但我很确定有一个非常简单的更新插入语法,如果我提到字段和值,它就会在整个集合中匹配它,如果匹配则更新,如果匹配则插入不要
def __generateRemoteData(data):
"""
Utils function to add remote data to Mongo
"""
for datum in data:
query = RemoteGraph.objects(
Q(fieldA=datum.get('fieldA')) and
Q(fieldB=datum.get('fieldB')) and
Q(fieldC=datum.get('fieldC')) and
Q(fieldD=datum.get('fieldD')) and
Q(fieldE=datum.get('fieldE')) and
Q(date=datum.get('date'))
)
if not query:
RemoteGraph(
fieldA=datum.get('fieldA'),
fieldB=datum.get('fieldB'),
fieldC=datum.get('fieldC'),
fieldD=datum.get('fieldD'),
fieldE=datum.get('fieldE'),
date=datum.get('date'),
fieldF=datum.get('fieldF'),
fieldG=datum.get('fieldG'),
).save()
else:
query.update(
set__fieldF=datum.get('fieldF'),
set__fieldG=datum.get('fieldG'),
)
正在寻找一种更像 Python 的方法来做到这一点。
我调查了 upsert
、insert
、modify
、save
、update
、update_one
首先,Q() 仅与按位运算符组合。而 Q 的意义在于组合 &
和 |
运算符。详细here
QuerySet::update
方法有一个特殊选项upsert=True
。 Upsert – 如果 RemoteGraph.objects(a=val_a, b=val_b, c=val_c, date=date)
找不到任何文档,则强制插入新文档。
RemoteGraph.objects(
a=val_a, b=val_b, c=val_c, date=date
).update(
a=val_a, b=val_b, c=val_c, date=date
)
还有[QuerySet::modify][3]
和QuerySet::update_one
方法,他们也可以插入新文档,但不像QuerySet::update
,他们会更新只有 QuerySet
.
最后还有 QuerySet::upsert_one
。这个名字说明了一切。一个明显的区别是,如果 QuerySet 包含多个文档,它会引发异常。实际上 QuerySet::update_one
和 QuerySet::upsert_one
是 QuerySet::update