插入后如何更新Mongo文档?

假设我插入文档。

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

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

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

在pymongo你可以更新:
mycollection.update({'_id':mongo_id}, {"$set": post}, upsert=False)
如果在数据库中找不到post,Upsert参数将插入而不是更新。
文档可在mongodb网站上find 。

更新版本> 3使用update_one而不是更新

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

我将这样使用collection.save(the_changed_dict) 。 我刚刚testing过,它仍然适用于我。 以下是直接从pymongo doc.引用pymongo doc.

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

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

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

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

saveupdate的方法已被弃用。

save(to_save,manipulate = True,check_keys = True,** kwargs)¶在这个集合中保存一个文档。

DEPRECATED – 使用insert_one()或replace_one()来代替。

在版本3.0中更改:删除安全参数。 对于未确认的写操作,传递w = 0。

update(spec,document,upsert = False,manipulate = False,multi = False,check_keys = True,** kwargs)更新此集合中的文档。

DEPRECATED – 改为使用replace_one(),update_one()或update_many()。

在版本3.0中更改:删除安全参数。 对于未确认的写操作,传递w = 0。

在OP的特定情况下,最好使用replace_one

根据PyMongo最新的标题为“ 插入文档” (插入已弃用) 的文档和遵循防御的方法,您应该插入和更新如下:

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

应该为你工作出色。 如果没有id mongo_id文档,它将会失败,除非你也使用upsert=True 。 这将默认返回旧文档。 要得到新的,传递return_document=ReturnDocument.AFTER 。 所有参数都在API中描述。