插入后如何更新Mongo文件?


83

假设我插入了文档。

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

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

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

Answers:


108

在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)


1
@Elliott-另一种选择是什么?
ajayramesh

29
mycollection.find_one_and_update({"_id": mongo_id}, 
                                 {"$set": {"newfield": "abc"}})

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

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


2
如果您将“ _id”替换为“ username” fyi之类的其他字段,它也会起作用
克里斯(Chris)

1
@Chris当您说“当前的pymongo”时,未来的我们可能没有相同的版本。很具体。
Mnebuerquo

@Mnebuerquo,这是我本来不会看到的一个很好的观点。将在以后的帖子中做,谢谢。
克里斯(Chris)

@Chris编辑很有帮助。谢谢!当我忘记了这一点并不得不再次查找时,请感谢future-me!
Mnebuerquo '18年

22

我会用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。


9

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

方法saveupdate已弃用。

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


9

根据有关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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.