You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 19:31:05