【问题标题】:How do I update a Mongo document after inserting it?插入后如何更新 Mongo 文档?
【发布时间】:2011-05-21 08:14:33
【问题描述】:

假设我插入了文档。

post = { some dictionary }
mongo_id = mycollection.insert(post)

现在,假设我想添加一个字段并更新它。我怎么做?这似乎不起作用.....

post = mycollection.find_one({"_id":mongo_id}) 
post['newfield'] = "abc"
mycollection.save(post)

【问题讨论】:

    标签: python mongodb pymongo database


    【解决方案1】:

    在 pymongo 中,您可以通过以下方式更新:
    mycollection.update({'_id':mongo_id}, {"$set": post}, upsert=False)
    如果在数据库中找不到帖子,Upsert 参数将插入而不是更新。
    文档可通过mongodb site 获得。

    UPDATE 对于版本 > 3,使用 update_one 而不是 update

    mycollection.update_one({'_id':mongo_id}, {"$set": post}, upsert=False)

    【讨论】:

    • @Elliott - 另一种选择是什么?
    【解决方案2】:

    我会这样使用collection.save(the_changed_dict)。我刚刚对此进行了测试,它仍然对我有用。以下直接引用自pymongo doc.

    save(to_save[, manipulate=True[, safe=False[, **kwargs]]])

    在此集合中保存一个文档。

    如果 to_save 已经有一个“_id”,那么 执行 update() (upsert) 操作并 任何具有该“_id”的现有文档是 覆盖。否则执行 insert() 操作。在这 如果操作为真,则将“_id”添加到 to_save 中,这 方法返回已保存文档的“_id”。如果操作为 False 服务器将添加“_id”,但此方法将返回 没有。

    【讨论】:

      【解决方案3】:

      这是一个老问题,但我在寻找答案时偶然发现了这个问题,所以我想对答案进行更新以供参考。

      saveupdate 方法已弃用。

      save(to_save, modify=True, check_keys=True, **kwargs)¶ 此集合中的文档。

      已弃用 - 改用 insert_one() 或 replace_one()。

      3.0 版更改:删除了安全参数。通过 w=0 为 未确认的写操作。

      更新(规范,文档,upsert=假,操作=假,多=假, check_keys=True, **kwargs) 更新此集合中的文档。

      已弃用 - 使用 replace_one()、update_one() 或 update_many() 而是。

      3.0 版更改:删除了安全参数。通过 w=0 为 未确认的写操作。

      在 OPs 的特殊情况下,最好使用replace_one

      【讨论】:

        【解决方案4】:

        根据有关 PyMongo 的最新文档 Insert a Document(不推荐插入)并遵循防御方法,您应该按如下方式插入和更新:

        result = mycollection.insert_one(post)
        post = mycollection.find_one({'_id': result.inserted_id})
        
        if post is not None:
            post['newfield'] = "abc"
            mycollection.save(post)
        

        【讨论】:

          【解决方案5】:
          mycollection.find_one_and_update({"_id": mongo_id}, 
                                           {"$set": {"newfield": "abc"}})
          

          应该为您出色地工作。如果没有id为mongo_id的文档,就会失败,除非你也使用upsert=True。默认情况下,这将返回旧文档。要获得新的,请通过return_document=ReturnDocument.AFTER。所有参数都在the API中描述。

          该方法是为 MongoDB 3.0 引入的。它已针对 3.2、3.4 和 3.6 进行了扩展。

          【讨论】:

          • 如果您将“_id”分到另一个字段(如“用户名”fyi),它也可以工作
          • @Chris 当你说“当前的 pymongo”时,我们这些未来的人可能没有相同的版本。很高兴能具体一点。
          • @Mnebuerquo 这是一个很好的观点,否则我不会看到。将在以后的帖子中这样做,谢谢。
          • @Chris 编辑有很大帮助。谢谢!当我忘记这一点并不得不再次查找时,来自未来的我的感谢!
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-19
          • 1970-01-01
          • 2021-04-23
          • 2014-05-15
          • 1970-01-01
          • 2016-05-15
          相关资源
          最近更新 更多