MongoDB 3.6.2中PyMongo的$set更新字段无效,求排查建议
嘿,我来帮你排查这个$set更新无效的问题,看完你的代码和目标文档,有几个常见的坑你可以逐个检查:
集合对象调用错误(最可能的原因)
你前面已经定义了collection = db['test'],但后面更新的时候用了db.collection.update(...)——这里的db.collection其实是指向名为collection的集合,而不是你要操作的test集合!这就导致你一直在错误的集合上执行更新,自然看不到效果。
修正方法:把db.collection.update改成collection.update,或者更推荐用新版本的update_one方法。使用推荐的更新方法并检查结果
在MongoDB 3.6对应的PyMongo版本中,update()属于旧API,推荐使用update_one()(单文档更新)或update_many()(多文档更新)。这些新方法会返回一个UpdateResult对象,你可以通过它查看是否匹配到文档、是否成功修改,方便排查问题。
比如像这样修改代码后,打印结果:result = collection.update_one( { "_id" : ObjectId("5a95a1c32a2e2e0025e6d6e2") }, { "$set": { "status": "submission" } } ) print(f"匹配到的文档数: {result.matched_count}") print(f"修改的文档数: {result.modified_count}")如果
matched_count是0,说明查询条件没找到文档;如果modified_count是0,说明字段值和原来一样,MongoDB不会执行更新操作。确认连接的数据库和集合正确
可以在代码里添加打印语句,确认当前操作的是预期的数据库和集合:print(f"当前数据库: {db.name}") print(f"当前集合: {collection.name}")避免因为连接字符串或集合名拼写错误,导致操作了错误的库/集合。
检查用户权限
确认你连接MongoDB使用的用户(dbuser)拥有data数据库中test集合的写入权限。可以尝试用该用户在MongoDB Shell中手动执行更新操作,看是否能成功:use data db.test.updateOne({ "_id" : ObjectId("5a95a1c32a2e2e0025e6d6e2") }, { "$set": { "status": "submission" } })如果Shell里也失败,大概率是权限问题。
检查字段值是否无变化(边缘情况)
如果你的更新值和文档中现有值完全一致(比如这里如果目标文档的status已经是submission),MongoDB会跳过更新,modified_count会显示0。不过看你的目标文档里是Submitting,所以这个情况应该不成立,但还是可以留意下。
修正后的完整代码示例
from pymongo import MongoClient from bson import ObjectId import os, pymongo dbuser = os.environ.get('user', '') dbpass = os.environ.get('pwd', '') uri = 'mongodb://{dbuser}:{dbpass}@machineip/data'.format(**locals()) client = MongoClient(uri) db = client.data collection = db['test'] print(db.version) # Python3中print是函数,需要加括号 # 使用update_one并检查更新结果 result = collection.update_one( { "_id" : ObjectId("5a95a1c32a2e2e0025e6d6e2") }, { "$set": { "status": "submission" } } ) print(f"匹配到的文档数: {result.matched_count}") print(f"修改的文档数: {result.modified_count}")
内容的提问来源于stack exchange,提问作者carte blanche

