插入后如何更新Mongo文档?

时间:2010-12-07 02:13:57

标签: python mongodb pymongo database

假设我插入了文档。

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

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

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

5 个答案:

答案 0 :(得分:98)

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

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

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

答案 1 :(得分:22)

我将以这种方式使用collection.save(the_changed_dict)。我刚测试了这个,它仍然适用于我。以下内容直接引自pymongo doc.

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

  

将文档保存在此集合中。

     

如果to_save已经有了“_id”那么   执行update()(upsert)操作   任何带有“_id”的现有文件都是   覆盖。否则执行insert()操作。在这   如果操作为True,则会将“_id”添加到to_save和this   method返回已保存文档的“_id”。如果操纵是假的   “_id”将由服务器添加,但此方法将返回   无。

答案 2 :(得分:22)

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

应该为你精彩地工作。如果没有标识为mongo_id的文档,则会失败,除非您还使用upsert=True。这默认返回旧文档。要获得新的,请通过return_document=ReturnDocument.AFTER。所有参数都在the API中描述。

该方法是为MongoDB 3.0引入的。它扩展到3.2,3.4和3.6。

答案 3 :(得分:9)

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

不推荐使用方法saveupdate

  

save(to_save,manipulate = True,check_keys = True,** kwargs)¶保存   本系列中的文档。

     

DEPRECATED - 改为使用insert_one()或replace_one()。

     

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

     

更新(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

答案 4 :(得分:8)

根据有关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)