【问题标题】:How to remove all occurrences of array element in nested array in mongodb如何删除mongodb中嵌套数组中所有出现的数组元素
【发布时间】:2022-11-16 13:25:07
【问题描述】:

我的数据库结构如下,它只有products中的一个documentnested array,由refproduct document's id组成。

{
_id:"6371e078393a5194cc674369"
data: Array
  [0]:{
    image:
    title:
    products: Array
      [0]:product1Id
      [1]:product2Id
      [2]:product3Id
  },
  [1]:{
    image:
    title:
    products: Array
      [0]:product2Id
      [1]:product3Id
      [2]:product4Id
  },
}

我的要求是当我从 product document 中删除 product3 时,我也想删除它的引用。所以在这里我想从嵌套的array中删除product3Id

更新后的文件看起来像:

{
_id:"6371e078393a5194cc674369"
data: Array
  [0]:{
    image:
    title:
    products: Array
      [0]:product1Id
      [1]:product2Id
  },
  [1]:{
    image:
    title:
    products: Array
      [0]:product2Id
      [1]:product4Id
  },
}

我的尝试:

result = await homeSpecialModel.updateMany(
  {
    _id: "6371e078393a5194cc674369",
  },
  // { $pull: { data: { products: { $eleMatch: new ObjectId(id) } } } } -- 1st try
  // { $pull: { "data.products": new ObjectId(id) } } -- 2nd try
);

两者似乎都不起作用!

【问题讨论】:

  • "_id" 是 ObjectId 还是字符串?
  • 它是主文档的 ID,为了更清楚,我更新了问题

标签: node.js mongodb mongoose mongodb-query


【解决方案1】:

这是使用"arrayFilters" 完成此操作的一种方法。

db.collection.update({
  _id: "6371e078393a5194cc674369"
},
{
  "$pull": {
    "data.$[elem].products": ObjectId("6371e078393a5194cc67436b")
  }
},
{
  "multi": true,
  "arrayFilters": [
    {
      "elem.products": ObjectId("6371e078393a5194cc67436b")
    }
  ]
})

试试mongoplayground.net

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 2017-05-18
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多