我的数据库 struct 如下,它只有一个documentproducts中的nested 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
  },
}

我的try :

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

两个看起来都不管用!

推荐答案

这里有一种使用"arrayFilters"的方法.

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

试穿一下mongoplayground.net号.

Node.js相关问答推荐

Node.js promise 循环中的所有多个API调用

如何将信号从终端窗口发送到运行在Raspberry Pi上的Puppeteer/Node.js上的webscraper

如何使用Node.js、Express和Mongoose创建多个API

express返回意外的URL

根据我的测试,为什么在编写Varint代码方面,NodeJS要比Rust快这么多?

如何从谷歌云中部署的应用程序连接到mongoDB Atlas?

函数声明中的异步在没有等待的函数中做什么?

我的 React + Express 应用程序不断向我的数组添加一个空对象

Rest-Api动态图像路径和Express除非

在 Docker 容器内创建一个 cron 作业(job)来执行 run.js 文件中的函数

mongoose 7.0.3 使用运算符 $and 严格搜索日期

如何使用 Jest 模拟异步函数的延迟时间

根据 mongoDB 中存在的唯一字符串生成唯一字符串的最佳方法

使用 Node.JS,如何按时间顺序获取文件列表?

如何可靠地散列 JavaScript 对象?

密码的 Node.js 散列

JavaScript 异步编程:promise 与生成器

Heroku + Node:找不到模块错误

npm install - javascript堆内存不足

Node.js - 判断是否安装了模块而不实际需要它