python - Mongodb批量写入Updateone或Updatemany

标签 python mongodb pymongo bulk

我想知道使用 updateoneupdatemany 进行批量写入是否更快(导入)。我使用 pymongo 将数据导入集合的代码如下:

for file in sorted_files:
    df = process_file(file)
    for row, item in df.iterrows():
        data_dict = item.to_dict()
        bulk_request.append(UpdateOne(
            {"nsamples": {"$lt": 12}},
            {
                "$push": {"samples": data_dict},
                "$inc": {"nsamples": 1}
            },
            upsert=True
        ))
    result = mycol1.bulk_write(bulk_request)

当我尝试更新许多内容时,我唯一改变的是:

...
...
bulk_request.append(UpdateMany(..
..
..

我没有发现插入时间有任何重大差异。updateMany 不应该更快吗? 也许我做错了什么。任何建议都会有帮助! 提前致谢!

注意:我的数据由 120 万行组成。我需要每个文档包含 12 个子文档。

最佳答案

@Wernfried Domscheit's答案是正确的。

此答案特定于您的场景。

如果您不介意不将记录更新到现有文档并完全插入新文档,请使用以下最适合您的用例的代码。

sorted_files = []
process_file = None
for file in sorted_files:
    df = process_file(file)
    sample_data = []
    for row, item in df.iterrows():
        sample_data.append(item.to_dict())
        if len(sample_data) == 12:
            mycol1.insertOne({
                "samples": sample_data,
                "nsamples": len(sample_data),
            })
            sample_data = []
    mycol1.insertOne({
        "samples": sample_data,
        "nsamples": len(sample_data),
    })

如果您想用 12 个对象填充现有记录,然后, 创建新记录,使用以下代码逻辑。

Note: I have not tested the code in my local, its just to understand the flow for you to use.

for file in sorted_files:
    df = process_file(file)
    sample_data = []
    continuity_flag = False
    for row, item in df.iterrows():
        sample_data.append(item.to_dict())
        if not continuity_flag:
            sample_rec = mycol1.find_one({"nsamples": {"$lt": 12}}, {"nsamples": 1})
            if sample_rec is None:
                continuity_flag = True
            elif sample_rec["nsamples"] + len(sample_data) == 12:
                mycol1.update_one({
                    "_id": sample_rec["_id"]
                }, {
                    "$push": {"samples": {"$each": sample_data}},
                    "$inc": {"nsamples": len(sample_data)}
                })
        if len(sample_data) == 12:
            mycol1.insert_one({
                "samples": sample_data,
                "nsamples": len(sample_data),
            })
            sample_data = []
    if sample_data:
        mycol1.insert_one({
            "samples": sample_data,
            "nsamples": len(sample_data),
        })

关于python - Mongodb批量写入Updateone或Updatemany,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67483255/

相关文章:

mongodb - 元类委托(delegate)不是实例

MongoDB - 配额超出错误代码 : 12501

java.lang.ExceptionInInitializerError 引起的 : com. fastxml.jackson.databind.JsonMappingException : Jackson version is too old 2. 5.1

python - pymongo:删除重复项( map 减少?)

Python如何检查输入是否只包含某些字符?

python - 定义类变量时出现NameError

python - 在一条记录中连接多个值而不重复

python - 如何使用 pymongo 将精确匹配词传递给 mongodb 查询?

mongodb - key 不得包含 . pymongo 中的错误

python - Pandas 数据框中的百分比匹配