如何在 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?的主要内容,如果未能解决你的问题,请参考以下文章