MongoDB:在pymongo中获取upsert结果

1 投票
1 回答
1300 浏览
提问于 2025-04-18 13:56

在MongoDB中,进行插入或更新操作时会返回一个写入结果:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

我想知道有没有办法从pymongo中访问这些字段?因为在pymongo中,更新操作总是返回空值,我想知道我查询的文档是否被修改过,或者它是否存在,而不需要再进行一次额外的查询。你能告诉我怎么做吗?

顺便说一下,我知道这个问题之前有人问过,但那是几年前的事了,我在谷歌上找到的所有信息都没有包含示例。

既然提到这个,有没有办法从插入或更新的结果中获取文档的字段?(或者至少获取_id)

解决方案:正如Neil Lunn所建议的,如果你想从更新中获取更多数据,使用Bulk API是个不错的选择。我想指出这个快速的指南,可以帮助你了解这个API。

1 个回答

3

从MongoDB 2.6版本开始,新的MongoDB命令行工具实际上为.update().insert()等方法定义了一些助手功能,这些功能使用的是“批量操作API”,在适用的情况下可以使用。

简单来说,当命令行工具连接到MongoDB 2.6或更高版本时,后台会使用“批量”方法。即使它们实际上一次只处理一个文档,或者只是发出“一次”更新请求等。

不过,普通的驱动接口还没有跟上这个变化,你仍然需要手动调用:

bulk = db.test.initialize_ordered_bulk_op()

bulk.find({}).upsert().update({ "$set" { "this": "that" } }

result = bulk.execute()

这里返回的“结果”符合你在命令行工具中看到的“批量写入结果”规范,这与当前标准驱动方法中使用的“旧版”实现返回的结果是不同的。

撰写回答