如何在MongoDB嵌套数组中移除指定元素的所有引用
问题
我的数据库仅包含一个文档,结构如下:data为嵌套数组,每个数组元素中又包含products数组,存储指向product文档的ID引用:
{ "_id": "6371e078393a5194cc674369", "data": [ { "image": "", "title": "", "products": [product1Id, product2Id, product3Id] }, { "image": "", "title": "", "products": [product2Id, product3Id, product4Id] } ] }
需求:删除product3文档时,同时移除所有嵌套数组中的product3Id引用,更新后文档结构如下:
{ "_id": "6371e078393a5194cc674369", "data": [ { "image": "", "title": "", "products": [product1Id, product2Id] }, { "image": "", "title": "", "products": [product2Id, product4Id] } ] }
我尝试了以下代码,但均未生效:
result = await homeSpecialModel.updateMany( { _id: "6371e078393a5194cc674369", }, // { $pull: { data: { products: { $eleMatch: new ObjectId(id) } } } } -- 第一次尝试 // { $pull: { "data.products": new ObjectId(id) } } -- 第二次尝试 );
解决方案
需要使用$[]数组更新操作符遍历data数组的所有元素,再对每个元素的products数组执行$pull操作,正确代码如下:
const productIdToRemove = new ObjectId(id); result = await homeSpecialModel.updateOne( { _id: "6371e078393a5194cc674369" }, { $pull: { "data.$[].products": productIdToRemove } } );
原写法失效原因:
- 第一次尝试的
$pull会直接删除整个data数组元素,而非仅移除products中的指定ID,不符合需求。 - 第二次尝试未添加
$[],MongoDB只会更新data数组中第一个匹配元素的products数组,无法遍历所有data元素处理其内部的products。
另外,由于仅需更新单个文档,使用updateOne比updateMany更贴合场景。
内容的提问来源于stack exchange,提问作者krishnaacharyaa
相关产品推荐
相关产品推荐

