【问题标题】:is PyMongo / MongoDB insert_many transactional?PyMongo / MongoDB insert_many 是事务性的吗?
【发布时间】:2021-05-30 13:17:58
【问题描述】:

为了提高上传速度,我有一个多处理 Python 程序,它将 CSV 拆分为多个部分,并在不同的过程中上传每个部分。同样为了速度,我将 3000 个插入物放在每个 insert_many 中。

诀窍是我在某些行中有一些错误数据,我还没有弄清楚它在哪里。所以我所做的是围绕 insert_many 的 Try/Except,然后我尝试再次插入 3000 个文档,但一次一个,在另一个 Try/Except 中。然后我可以只对有错误的行执行 pprint.pprint。

但是,我想知道当 3000 个文档的更新由于错误(例如第 1000 行)而失败时,整个 3000 个文档是否都失败了?还是前 999 行被存储而其余的都失败了?还是存储了 2999 行,只有一个坏数据行失败?

【问题讨论】:

    标签: python-3.x mongodb pymongo


    【解决方案1】:

    当您通过批量写入进行插入时,您可以设置有序选项。

    ordered 为真时,插入在第一个错误处停止。

    当ordered 为false 时,插入继续通过每个因任何原因失败的文档。

    在任何一种情况下,批量写入都不是事务性的,因为失败不会删除任何先前执行的写入(插入或其他)。

    如果您想要一个事务,MongoDB 会提供这些作为显式功能。

    【讨论】:

    • 谢谢!但是没有办法回滚第一个?
    • 另外,现在有办法确定 3000 行中的哪一行失败了?有没有可以返回的rowNumber?
    • 如果你想有一个事务,使用事务。批量写入错误返回有关失败的信息,认为这不一定在驱动程序文档中广泛记录。
    猜你喜欢
    • 2016-11-16
    • 2021-03-05
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多