You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PyMongo更新数据后,pprint无法输出修改后的数据

问题:PyMongo更新后无法获取修改后的实际数据

环境

  • Python、MongoDB、PyMongo

问题核心

调用update_one或update_many后,返回的是pymongo.results.UpdateResult类型对象,使用print或pprint输出只能看到对象本身的信息,无法获取到被修改的实际文档数据。

相关代码

import pymongo
import datetime
import json
from pprint import pprint

def init_db(ip, db, coll):
    myclient = pymongo.MongoClient('mongodb://' + ip + '/')
    mydb = myclient[db]
    mycol = mydb[coll]

    return mydb, mycol

def change_db_data(myquery_json, one_or_many_bool, newvalues_json ):
    
    if one_or_many_bool == True:
        x = mycol.products.update_many(myquery_json, newvalues_json)
    else:
        x = mycol.products.update_one(myquery_json, newvalues_json)
    return x

ip_input = input("Enter the ip: ")
exist_DB_name = input("Enter exist DB name: ")
exist_coll_name = input("Enter exist collection name: ")
mydb, mycol  = init_db(ip_input, exist_DB_name, exist_coll_name)

myquery_str = input("Enter ur query: ")
update_one_or_many = input("U are update one or many values? (ex:1 for many , 0 for one): ")
newvalues_str = input("Enter new values: ")

one_or_many_bool = bool(int(update_one_or_many))

myquery_json =json.loads(myquery_str)
newvalues_json =json.loads(newvalues_str)
x = change_db_data(myquery_json, one_or_many_bool, newvalues_json)
print(x)
print(type(x))

pprint(x)
pprint(type(x))

执行输出

Enter the ip: localhost:27017
Enter exist DB name: (practice_10_14)-0002
Enter exist collection name: collection_new02cp
Enter ur query: { "name": { "$regex": "^R" }, "Age" : { "$gt": 50 } }
U are update one or many values? (ex:1 for many , 0 for one): 1
Enter new values: { "$set": { "name": "Old Mr.R" }}

<pymongo.results.UpdateResult object at 0x00000216021EA080>
<class 'pymongo.results.UpdateResult'>

<pymongo.results.UpdateResult object at 0x00000216021EA080>
<class 'pymongo.results.UpdateResult'>

解决方案

1. 获取单个修改后的文档

将update_one替换为find_one_and_update,并指定return_document=ReturnDocument.AFTER参数,直接返回更新后的文档。

2. 获取多个修改后的文档

update_many仅返回更新统计信息(如修改数量),需先执行更新,再用原查询条件重新查询数据库获取所有修改后的文档。

修改后的代码示例

import pymongo
import json
from pprint import pprint
from pymongo import ReturnDocument  # 新增导入

def init_db(ip, db, coll):
    myclient = pymongo.MongoClient('mongodb://' + ip + '/')
    mydb = myclient[db]
    mycol = mydb[coll]
    return mydb, mycol

def change_db_data(mycol, myquery_json, one_or_many_bool, newvalues_json ):
    if one_or_many_bool:
        # 执行批量更新
        update_result = mycol.update_many(myquery_json, newvalues_json)
        # 重新查询获取修改后的文档
        updated_docs = list(mycol.find(myquery_json))
        return update_result, updated_docs
    else:
        # 获取单个修改后的文档
        updated_doc = mycol.find_one_and_update(
            myquery_json,
            newvalues_json,
            return_document=ReturnDocument.AFTER
        )
        return updated_doc

ip_input = input("Enter the ip: ")
exist_DB_name = input("Enter exist DB name: ")
exist_coll_name = input("Enter exist collection name: ")
mydb, mycol  = init_db(ip_input, exist_DB_name, exist_coll_name)

myquery_str = input("Enter ur query: ")
update_one_or_many = input("U are update one or many values? (ex:1 for many , 0 for one): ")
newvalues_str = input("Enter new values: ")

one_or_many_bool = bool(int(update_one_or_many))
myquery_json = json.loads(myquery_str)
newvalues_json = json.loads(newvalues_str)

result = change_db_data(mycol, myquery_json, one_or_many_bool, newvalues_json)

if one_or_many_bool:
    print(f"成功更新 {result[0].modified_count} 条文档")
    print("\n修改后的文档:")
    pprint(result[1])
else:
    print("修改后的文档:")
    pprint(result)

说明

  • find_one_and_update的return_document参数:设置为ReturnDocument.AFTER返回更新后的文档,默认ReturnDocument.BEFORE返回更新前的文档。
  • 批量更新后重新查询时,需确保原查询条件仍能匹配到修改后的文档(若更新操作未改变查询条件的匹配性)。

内容的提问来源于stack exchange,提问作者j ton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 10:20:36