如何使用PyMongo为MongoDB现有数组内的所有对象新增字段
如何为MongoDB数组中的每个对象新增/更新字段?
我明白你的需求啦——要给MongoDB集合里文档的values.ping数组中每个对象都新增/更新new: added_new这个键值对,之前用$addToSet没效果很正常,因为它的作用是向数组中添加不重复的元素,而不是修改数组内部对象的属性,完全不是一回事儿~
下面给你两种实现方式,分别是MongoDB原生Shell查询和PyMongo代码:
一、MongoDB Shell 实现
使用$set配合数组通配符$[],这个通配符会匹配数组中的所有元素,从而给每个对象都添加/更新指定字段:
// 更新单个指定文档 db.your_collection.updateOne( {"_id": ObjectId("sdhsndi66822dsxsd")}, // 目标文档的查询条件 { "$set": { "values.ping.$[].new": "added_new" } } ) // 如果要更新所有符合条件的文档,用updateMany // db.your_collection.updateMany( // {}, // 这里可以添加你的查询过滤条件,留空则更新所有文档 // {"$set": {"values.ping.$[].new": "added_new"}} // )
二、PyMongo 实现
逻辑和Shell查询一致,只是转换成Python的字典结构:
from pymongo import MongoClient from bson.objectid import ObjectId # 连接数据库 client = MongoClient('mongodb://localhost:27017/') db = client['your_database_name'] # 替换成你的数据库名 collection = db['your_collection_name'] # 替换成你的集合名 # 更新单个指定文档 collection.update_one( {"_id": ObjectId("sdhsndi66822dsxsd")}, {"$set": {"values.ping.$[].new": "added_new"}} ) # 更新所有符合条件的文档(可选) # collection.update_many( # {}, # 自定义查询条件,比如{"values.ping.key": "xxx"} # {"$set": {"values.ping.$[].new": "added_new"}} # )
额外补充:只更新数组中满足特定条件的元素
如果你不需要给数组里所有对象加字段,只想更新符合某个条件的对象(比如key等于特定值),可以用arrayFilters来过滤:
MongoDB Shell 版本
db.your_collection.updateOne( {"_id": ObjectId("sdhsndi66822dsxsd")}, { "$set": { "values.ping.$[elem].new": "added_new" } }, { arrayFilters: [{"elem.key": "5ef9ac6eb1272e16729b17f6"}] } )
PyMongo 版本
collection.update_one( {"_id": ObjectId("sdhsndi66822dsxsd")}, {"$set": {"values.ping.$[elem].new": "added_new"}}, array_filters=[{"elem.key": "5ef9ac6eb1272e16729b17f6"}] )
内容的提问来源于stack exchange,提问作者Navi
相关产品推荐
相关产品推荐

