node.js - 由于某种原因,bulkWrite 和 arrayFilter 没有修改文档。 MongoDB 和 Mongoose

标签 node.js mongodb mongoose

我有这两个子文档,它们的结构基本相同。每个文档都包含一个名为 scheduleInfo 的对象数组。该数组的结构如下。

设备列表

scheduleInfo: [{month: String, hours: Number, frequency: String, equipId: String, uniqId: String}]

额外人工

scheduleInfo: [{month: String, hours: Number, frequency: String, addLaborId: String, uniqId: String}]

这是我用来将对象添加到 equipmentList 中的 scheduleInfo 的代码

 OpportunityModel.bulkWrite(
  equipSch.map(d => ({
    updateOne: {
      filter: { sfOppId: oppId },
      update: {
        $set: { "equipmentList.$[e].scheduleInfo": d.equipSch }
      },
      upsert: true,
      arrayFilters: [{ "e.sfEquipId": d.equipId }]
    }
  }))
)

这段代码执行正确。 由于additionalLabor中的scheduleInfo本质上是相同的东西,所以这是我用来将对象添加到additionalLabor

中的scheduleInfo的代码
 OpportunityModel.bulkWrite(
  additionalLaborSch.map(d => ({
    updateOne: {
      filter: { sfOppId: oppId },
      update: {
        $set: { "additionalLaborCostInfo.$[e].scheduleInfo": d.schedule }
      },
      upsert: true,
      arrayFilters: [{ "e._id": d.addLaborId }]
    }
  }))

它不起作用我得到一个读数,显示它找到了匹配的文档,但没有修改任何文档。

如果我去掉列表过滤器并使用通配符 $[] ,它会修改文档,但为所有附加劳动力项目设置相同的时间表,这是不正确的。我已经盯着这段代码有一段时间了,我不知道为什么它不起作用。请帮忙!

最佳答案

感谢 Tom ( https://stackoverflow.com/users/10770370/tom-slabbaert)and actraiser ( https://stackoverflow.com/users/2340924/actraiser ),我找到了解决方案。将 extraLabor 的 arrayFilters 更改为

arrayFilters: [{ "e._id": mongoose.Types.ObjectId(d.addLaborId) }]

有效。

关于node.js - 由于某种原因,bulkWrite 和 arrayFilter 没有修改文档。 MongoDB 和 Mongoose ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60528711/

相关文章:

javascript - Azure 函数服务总线输出消息属性

node.js - 没有 Mongoose ,不能从nodejs异或mongodb字段

javascript - graphql-JS Express 无法解析字段

javascript - Mongoose 不保存嵌套对象

javascript - Node js mongodb中的增量计数器

mongodb 碎片,这种情况下有多少 mongod

node.js - 删除 Mongoose 中的多对多引用

javascript - 使用node.js require加载模块

javascript - Node Express Mongoose 数组未填充引用模型

javascript - 如何在 mongodb 中将 $push 、 $set 和 $inc 放在一起?