如果不使用 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 的方法来做到这一点。

我调查了 upsertinsertmodifysaveupdateupdate_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_oneQuerySet::upsert_oneQuerySet::update

的小包装