假设我插入了文档。
post = { some dictionary }
mongo_id = mycollection.insert(post)
现在,假设我要添加一个字段并进行更新。我怎么做?这似乎不起作用.....
post = mycollection.find_one({"_id":mongo_id})
post['newfield'] = "abc"
mycollection.save(post)
答案 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)
这是一个老问题,但在寻找答案时我偶然发现了这个问题,所以我想把答案的更新作为参考。
不推荐使用方法save
和update
。
在特定情况下的OP中,最好使用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表示 未经确认的写操作。
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)