使用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
相关产品推荐
相关产品推荐

