假设我插入了文档。
post = { some dictionary }
mongo_id = mycollection.insert(post)
现在,假设我要添加一个字段并对其进行更新。我怎么做?这似乎不起作用.....
post = mycollection.find_one({"_id":mongo_id})
post['newfield'] = "abc"
mycollection.save(post)
Answers:
在pymongo中,您可以使用以下内容
mycollection.update({'_id':mongo_id}, {"$set": post}, upsert=False)
进行更新:如果在数据库中未找到该帖子,则将插入Upsert参数而不是更新。
文档可在mongodb网站上找到。
UPDATE对于版本> 3,请使用update_one而不是update:
mycollection.update_one({'_id':mongo_id}, {"$set": post}, upsert=False)
mycollection.find_one_and_update({"_id": mongo_id},
{"$set": {"newfield": "abc"}})
应该为您出色地工作。如果没有id的文档mongo_id
,它将失败,除非您也使用upsert=True
。默认情况下,这将返回旧文档。要获得新的,请通过return_document=ReturnDocument.AFTER
。API中描述了所有参数。
该方法是针对MongoDB 3.0引入的。它被扩展为3.2、3.4和3.6。
我会用collection.save(the_changed_dict)
这种方式。我刚刚测试过,它仍然对我有用。以下内容直接引自pymongo doc.
:
save(to_save[, manipulate=True[, safe=False[, **kwargs]]])
将文档保存在此集合中。
如果to_save已经具有“ _id”,则将执行update()(更新)操作,并且所有具有该“ _id”的现有文档都将被覆盖。否则,将执行insert()操作。在这种情况下,如果操纵为True,则将“ _id”添加到to_save,并且此方法返回已保存文档的“ _id”。如果操纵为False,则服务器将添加“ _id”,但此方法将返回None。
这是一个古老的问题,但是我在寻找答案时偶然发现了这个问题,因此我想对答案进行更新以供参考。
方法save
和update
已弃用。
save(to_save,handler = True,check_keys = True,** kwargs)¶将文档保存在此集合中。
弃用-改用insert_one()或replace_one()。
在版本3.0中更改:删除了安全参数。传递w = 0进行未确认的写操作。
update(spec,document,upsert = False,操作= False,multi = False,check_keys = True,** kwargs)更新此集合中的文档。
弃用-请改用replace_one(),update_one()或update_many()。
在版本3.0中更改:删除了安全参数。传递w = 0进行未确认的写操作。
在OP的特定情况下,最好使用replace_one
。