如何在 pymongo 中使用 upsert?

Posted

技术标签:

【中文标题】如何在 pymongo 中使用 upsert?【英文标题】:How can I use upsert in pymongo? 【发布时间】:2021-01-26 15:14:09 【问题描述】:

我直接把postgresql中的数据转成json再传给mongo。

sql= """select array_to_json(array_agg(row_to_json(a))) from(select * from ) a ;  """.format(row[0])
            cursor.execute(sql_etl)
            data = cursor.fetchall()
            data=data[0][0]
if isinstance(data, list):
    collection.insert_many(data,upsert=True)
    
else:
    collection.insert_one(data)

我为此使用了 insert_many。但是我与 insert_many 重复。 Pymongo 也有重复插入。在 update_many 函数中使用。如何在 update_many 中使用这个 upsert?

【问题讨论】:

【参考方案1】:

您可以使用bulk_write进行多次写入操作。

ReplaceOne 进行“upsert”查询

from pymongo import ReplaceOne

upserts = [ReplaceOne("_id": x["_id"], x, upsert=True) for x in data]
collecion.bulk_write(upserts, ordered=True)

【讨论】:

谢谢。但是 x ['id'] 给出了错误。我也这样做了>>[ReplaceOne("_id": next(iter(x.values())), x, upsert=True) for x in data]。但是现在我从 postgresql 中提取的 id 与我放入 mongodb 的 '_id' 相同? 是的,这样做 iit 将成为 postgresql 中的 id。我在示例中使用了_id,但您可以使用 mongo 查询的任何字段来查找它是插入还是更新。

以上是关于如何在 pymongo 中使用 upsert?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PyMongo 在重复键错误后继续插入

如何优化 pymongo 中的更新查询以进行抓取项目

在pymongo的update_one()中出现重复键错误

Pymongo 没有修改所有匹配的文档

如何使用柴油在 sqlite 中进行 upsert?

如何在 pymongo 中使用 mongo 函数?