【问题标题】:For some reason, bulkWrite and arrayFilter are not modifying the document. MongoDB and Mongoose出于某种原因,bulkWrite 和 arrayFilter 没有修改文档。 MongoDB 和猫鼬
【发布时间】:2020-06-17 02:27:14
【问题描述】:

我有这两个基本结构相同的子文档。这些文档中的每一个都包含一个名为 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 }]
    }
  }))

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

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

【问题讨论】:

  • 你的语法是正确的,猫鼬在 5.4 上有一个长期存在的错误,arrayfilters
  • 感谢您的回复。尽管这并不令人欣慰。我是 SOL 吗?
  • 还不错,我刚刚降级到 5.3,它为我解决了这个问题。
  • 这有帮助。我能够问一个更好的问题并找到了这个。 (stackoverflow.com/questions/48215167/…)
  • 再次感谢,救命稻草。

标签: node.js mongodb mongoose


【解决方案1】:

感谢 Tom (https://stackoverflow.com/users/10770370/tom-slabbaert)andactraiser (https://stackoverflow.com/users/2340924/actraiser) 我能够找到解决方案。将我的 arrayFilters for additionalLabor 更改为

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

有效。

【讨论】:

    猜你喜欢
    • 2018-01-28
    • 2018-06-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2017-01-28
    • 2021-04-13
    • 2021-12-06
    • 1970-01-01
    相关资源
    最近更新 更多