【问题标题】:ReplaceOne if query matches, InsertOne if document does not existReplaceOne 如果查询匹配,InsertOne 如果文档不存在
【发布时间】:2021-05-21 05:37:45
【问题描述】:

我正在尝试使用 pymongo 编写一个数据迁移脚本

  1. 如果{'_id': id, 'array.0':{'$exists':False} } 匹配,则替换一个
  2. 如果具有给定id 的文档不存在,则插入一个,即检查'array.0':{'$exists':False}

目前脚本是这样的

from pymongo import ReplaceOne

def replace_one(row, id):
    return ReplaceOne({'_id': id, 'array.0':{'$exists':False} }, row, upsert=True)

这可能会导致重复键错误,因为upsert=True 会在查询不匹配且具有查询 ID 的文档已存在时尝试创建文档。但我只想在文档之前不存在的情况下创建文档。

另一个要求是我不想使用更新,因为当你有很多行时它会慢得多。

【问题讨论】:

    标签: python mongodb pymongo database-migration


    【解决方案1】:

    从您的代码看来,您正在使用批量操作符。

    您需要使用的是UpdateOne(),然后在您的批量写入中添加ordered=False 参数。这将尝试更新,但忽略任何错误(即重复错误)。

    在您的示例中,UpdateOne 没有理由比 ReplaceOne 慢。

    https://pymongo.readthedocs.io/en/stable/examples/bulk.html#unordered-bulk-write-operations

    【讨论】:

    • 谢谢! ordered=False 成功了。我仍然更喜欢使用 ReplaceOne:p
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    相关资源
    最近更新 更多