如何在插入后更新Mongo文档?
假设我插入了一个文档。
post = { some dictionary }
mongo_id = mycollection.insert(post)
现在,我想添加一个字段并更新它。我该怎么做呢?这似乎不太管用.....
post = mycollection.find_one({"_id":mongo_id})
post['newfield'] = "abc"
mycollection.save(post)
5 个回答
22
我会这样使用 collection.save(the_changed_dict)
。我刚刚测试过,这个方法对我来说还是有效的。下面的内容是直接引用自 pymongo 文档
:
save(to_save[, manipulate=True[, safe=False[, **kwargs]]])
在这个集合中保存一个文档。
如果要保存的内容
to_save
已经有一个 "_id",那么就会执行一个更新操作(也叫 upsert),这时会把任何已有的 "_id" 文档覆盖掉。否则,就会执行插入操作。在这种情况下,如果manipulate
是 True,to_save
会被添加一个 "_id",这个方法会返回保存文档的 "_id"。如果manipulate
是 False,"_id" 会由服务器添加,但这个方法会返回 None。
37
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版本中进行了扩展。
127
在pymongo中,你可以使用以下方式进行更新:
mycollection.update({'_id':mongo_id}, {"$set": post}, upsert=False)
如果在数据库中找不到要更新的内容,upsert参数会让它插入新的内容,而不是更新已有的内容。
你可以在mongodb网站上查看相关文档。
更新 对于版本大于3的情况,使用update_one
来代替update
:
mycollection.update_one({'_id':mongo_id}, {"$set": post}, upsert=False)