使用pymong进行批量条件更新

2024-09-30 19:36:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Python编写一些代码,并用Pymongo在mongoDB中存储数据。我想在数据结构中为每个时隙存储某些计数器:

{
    "connip": "a",
    "timeline": [
        {
            "timeslot": "1",
            "counter": 1
        },
        {
            "timeslot": "2",
            "counter": 1
        }
    ]
}

为了更新数据,我最初设法创建了正确工作的代码。主要问题是,为了更新数组,我必须检查数组是否存在,并且必须创建或更新特定条目:

ci="a"
ts="1"
cnt = 3
c = mlcol.count_documents({"connip": ci, "timeline.timeslot": ts})
if (c > 0):
    mlcol.update_one({"connip": ci, "timeline.timeslot": ts}, {"$inc":{"timeline.$.counter":cnt}}, upsert=True)
else:
    c = mlcol.count_documents({"connip": ci})
    if (c > 0):
        mlcol.update_one({"connip": ci}, {'$push': {"timeline": {"timeslot": ts,"counter":cnt}}})
    else:
        mlcol.insert_one({"connip": ci,"timeline":[{"timeslot": ts,"counter":cnt}]})

当我尝试编写代码来执行批量操作时,我有以下命令可以独立正常工作:

bulk=mlcol.initialize_unordered_bulk_op()
bulk.insert({"connip": ci,"timeline":[{"timeslot": ts,"counter":cnt}]})
bulk.find({"connip": ci}).upsert().update({'$push': {"timeline": {"timeslot": ts,"counter":cnt}}})
bulk.find({"connip": ci, "timeline.timeslot": ts}).upsert().update({"$inc":{"timeline.$.counter":cnt}})
res=bulk.execute()

使用大容量操作,我无法检查要运行的操作,因为在执行大容量操作之前,我无法检查数组是否存在

有没有一种方法可以在执行期间使此操作有条件

在单个命令中插入或更新数据的任何其他方式

如果没有阵列,满足需要的单个命令是:

bulk.find({"connip": conip}).upsert().update({"$inc":{ts:cnt}})

Tags: 数据代码cicounterupdate数组bulkone