如何在插入后更新Mongo文档?

95 投票
5 回答
134714 浏览
提问于 2025-04-16 08:09

假设我插入了一个文档。

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)

撰写回答