【问题标题】:Python - Pymongo Insert and Update DocumentsPython - Pymongo 插入和更新文档
【发布时间】:2020-01-31 11:05:02
【问题描述】:

使用 PyMongo,我在一个列表中有一组字典,我想提交给我的 MongoDB。列表中有些项目是新条目,有些是要更新的。

例子:

在服务器数据库上:

[{"_id" : 1, "foo" : "bar}]

发送到数据库:

[{"_id" : 1, "foo" : "HELLO"}, {"_id" : 2, "Blah" : "Bloh"}]

我目前正在使用以下方法插入文档,但我将如何执行上述操作?任何帮助表示赞赏!

collection.insert(myDict)

【问题讨论】:

    标签: python mongodb pymongo


    【解决方案1】:

    使用upsert 选项:

    from pymongo import MongoClient
    cl = MongoClient()
    coll = cl["local"]["test2"]
    
    data = [{"_id" : 1, "foo" : "HELLO"}, {"_id" : 2, "Blah" : "Bloh"}]
    for d in data:
        coll.update({'_id':d['_id']}, d, True)
    

    【讨论】:

    • 有没有办法通过一个 API 调用来做到这一点?类似于“批量”更新,以获得更好的性能。
    • @John 您是否找到了批量执行此操作的方法?类似于 insert_many 的东西
    • 如何获取每个插入对象的object_id? @Roman Pekar
    • 弃用警告:不推荐使用更新。请改用 replace_one、update_one 或 update_many。 [Pymongo 3.12.0]
    【解决方案2】:

    你也可以使用save

    import pymongo
    con = pymongo.MongoClient()
    coll = con.db_name.collection_name
    
    docs = [{"_id" : 1, "foo" : "HELLO"}, {"_id" : 2, "Blah" : "Bloh"}]
    
    for doc in docs:
        coll.save(doc)
    

    【讨论】:

    【解决方案3】:

    您必须使用upsert 来更新(或插入)您的数据

    from pymongo import MongoClient
    client = MongoClient()
    collection = client.my_database.my_collection
    
    objects = [{"_id" : 1, "foo" : "HELLO"}, {"_id" : 2, "Blah" : "Bloh"}]
    for obj in objects:
         collection.replace_one({"_id": obj["_id"]}, obj, upsert=True) 
    
    

    使用replace_one作为update方法is deprecated

    https://api.mongodb.com/python/current/api/pymongo/collection.html#pymongo.collection.Collection.replace_one

    如果你想使用批量更新:

    from pymongo import ReplaceOne
    
    update_objects = list()
    for obj in objects:
        update_objects.append(ReplaceOne( {'_id': obj['_id']},  obj, upsert=True))
    
    collection.bulk_write(update_objects)
    

    【讨论】:

      【解决方案4】:

      对于 pymongo 3.0 及更高版本:

      import pymongo
      con = pymongo.MongoClient()
      collection = con.db_name.collection_name
      
      docs = [{"_id" : 1, "foo" : "HELLO"}, {"_id" : 2, "Blah" : "Bloh"}]
      for d in docs:
          collection.update_many({'_id':d['_id']}, d,True)
      

      参考:http://api.mongodb.org/python/current/api/pymongo/collection.html

      【讨论】:

        猜你喜欢
        • 2023-01-23
        • 2014-01-17
        • 2014-10-24
        • 1970-01-01
        • 2015-09-27
        • 1970-01-01
        • 2021-06-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多