MongoDB中未知对象字段键名、仅知对应值时如何删除该字段?
解决方案
你可以通过先匹配sensor嵌套对象下对应目标值的键名,再执行删除操作,根据你的MongoDB版本可选择以下方案:
方案1:先查询确认键名(适合低版本MongoDB,手动操作)
通过聚合查询直接定位到对应值的键名,查询语句如下:
// 定位匹配目标值的键名 db.getCollection('algorithm_association_collection').aggregate([ { $addFields: { sensor_kv: { $objectToArray: "$sensor" } } }, { $match: { "sensor_kv.v": ObjectId("618e3fc8fccb88b50f2d9317") } }, { $project: { matched_key: "$sensor_kv.k", _id: 0 } } ])
拿到返回的键名后,就可以使用你已知的$unset语句删除对应字段。
方案2:一键批量删除(MongoDB 4.2及以上版本适用)
直接使用支持聚合管道的更新语句,无需提前获知键名即可自动删除匹配的键值对:
db.getCollection('algorithm_association_collection').updateMany( {}, [ { $set: { sensor: { $arrayToObject: { $filter: { input: { $objectToArray: "$sensor" }, cond: { $ne: [ "$$this.v", ObjectId("618e3fc8fccb88b50f2d9317") ] } } } } } } ] )
方案3:低版本MongoDB批量处理方案
如果你的MongoDB版本低于4.2,不支持更新语句传入聚合管道,可以用游标遍历文档处理:
const targetVal = ObjectId("618e3fc8fccb88b50f2d9317") db.getCollection('algorithm_association_collection').find({}).forEach(doc => { if (!doc.sensor) return for (const key in doc.sensor) { if (doc.sensor[key].toString() === targetVal.toString()) { db.getCollection('algorithm_association_collection').updateOne( { _id: doc._id }, { $unset: { [`sensor.${key}`]: "" } } ) break } } })
内容的提问来源于stack exchange,提问作者Rohit
相关产品推荐
相关产品推荐

