【问题标题】:Insert many documents into empty collection, update if document with same key already exist for mongodb将许多文档插入空集合中,如果 mongodb 已经存在具有相同键的文档,则更新
【发布时间】:2020-06-06 22:02:29
【问题描述】:

我有这个字典列表json_data

json_data = [
  {
    "CODE": "018906",
    "X": "29813.66349",
    "Y": "28697.520760000003"
  },
  {
    "CODE": "018907",
    "X": "30041.8389",
    "Y": "28602.98724"
  },
  {
    "CODE": "018910",
    "X": "31966.120789999997",
    "Y": "29115.75337"
  },
]

我有这个 mongodb 集合code_col。 当集合为空时,我想将json_data 插入集合code_col。下次可能会有一个新的json_data,如果CODE的key相同,文档应该更新而不是插入。

我正在使用 python 3.7、pymongo、mongodb 4.2.7。

【问题讨论】:

  • 循环遍历 json_data 并使用replace_one 使用CODE 作为过滤器和upsert=True。如果仍然卡住发布您的代码。
  • 这能回答你的问题吗? Merge Mongodb collection and a Python Dict --> 把它当作 dup..

标签: python python-3.x mongodb pymongo


【解决方案1】:

您只需将upsert 标志设置为True

for j in json_data:
    db.code_col.update_one({'CODE': j['CODE']},
                           {'$set': {'X': j['X'], 'Y': j['Y']}},
                           upsert=True)

更新:通过使用bulk_write 方法,我们可以在一定程度上减少此操作的时间。

from pymongo import UpdateOne

requests = []
for j in json_data:
    requests.append(UpdateOne({'CODE': j['CODE']},
                              {'$set': {'X': j['X'], 'Y': j['Y']}},
                              upsert=True))
db.code_col.bulk_write(requests)

【讨论】:

  • 感谢您的回答。我测试了你的代码,当有很多文档要添加时,它似乎很慢。是否可以使用 update_many 或 replace_many 来加快进程?
  • 我对 MongoDB 中的批量操作很感兴趣,我没有尝试过,对此我并不熟悉。我一试就会告诉你。
  • 我已经编辑了答案,如果有帮助请告诉我。
  • 感谢您的努力。一件事要编辑。最后一行应该是db.code_col.bulk_write(requests)s 不见了。
猜你喜欢
  • 2021-06-03
  • 1970-01-01
  • 2017-03-07
  • 2014-02-14
  • 2019-04-14
  • 2019-08-04
  • 1970-01-01
  • 1970-01-01
  • 2016-10-14
相关资源
最近更新 更多