MongoDB嵌套数组对象批量$pull操作失败,求解决方案
从MongoDB嵌套数组批量删除指定对象的问题与解决
问题场景
我的Users集合数据结构如下:
{ "_id": "wef324DGSshf", "userTypes": [ { "type": "students", "users": [ { "name": "John", "age": 20 }, { "name": "Mike", "age": 20 }, { "name": "Henry", "age": 30 }, { "name": "Henry", "age": 40 } ] } ] }
我需要删除满足type: "students"且age在[20,40]范围内的users数组对象,输入参数为type和ages,预期结果如下:
{ "_id": "wef324DGSshf", "userTypes": [ { "type": "students", "users": [ { "name": "Henry", "age": 30 } ] } ] }
尝试的错误代码
我用了以下查询但没有效果:
Users.update({ "userTypes.type": "students", "userTypes.users.age": {$in: [20, 40]}, }, { $pull: { "userTypes": { "userTypes.users.$.age": {$in: [20, 40]} } } });
错误原因
- 操作对象错误:你当前的
$pull是针对userTypes数组,试图删除整个userTypes元素,但实际需求是修改userTypes内部的users数组,删除其中的子对象。 - 位置操作符用法错误:
$位置操作符的写法不符合语法,嵌套数组的修改需要更精准的定位方式。
正确实现方案
要实现需求,需要使用**过滤式位置操作符$[<identifier>]**来定位符合type: "students"的userTypes元素,再对其users数组执行$pull操作(MongoDB 3.6及以上版本支持):
Users.update( { "userTypes.type": "students" }, { $pull: { "userTypes.$[typeMatch].users": { age: { $in: [20, 40] } } } }, { arrayFilters: [{ "typeMatch.type": "students" }] } );
代码说明
arrayFilters中的typeMatch作为标识符,精准匹配userTypes数组里type为students的元素。userTypes.$[typeMatch].users直接定位到该元素下的users数组。$pull操作会删除users数组中所有age在[20,40]范围内的对象,正好保留age=30的元素。
批量更新注意事项
如果需要更新所有符合条件的文档,要在第三个参数里加上multi: true:
Users.update( { "userTypes.type": "students" }, { $pull: { "userTypes.$[typeMatch].users": { age: { $in: [20, 40] } } } }, { arrayFilters: [{ "typeMatch.type": "students" }], multi: true } );
内容的提问来源于stack exchange,提问作者StormTrooper
相关产品推荐
相关产品推荐

