插入后如何更新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。
这是一个古老的问题,但我在寻找答案时偶然发现了这个问题,所以我想给出更新的答案供参考。
save
和update
的方法已被弃用。
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中描述。