【问题标题】:Can I update the documents in a single updateMany query or I have to hit the update query multiple times?我可以在单个 updateMany 查询中更新文档还是必须多次点击更新查询?
【发布时间】:2020-05-15 18:50:39
【问题描述】:

我有一个“交付”模式,其中包含一个名为“deliverySubZoneSets”的字段,它是一个对象数组,

"deliverySubZoneSets" : [ 
        {
            "charges" : {
                "delivery" : 30,
                "service" : 0,
                "packing" : 0,
                "parking" : 50
            },
            "areas" : [ 
                ObjectId("5d99c2a93a6a615ff9f7355a")
            ],
            "deliveryAvgMaxTime" : 30,
        }
    ]

我想用“deliveryAvgMaxTimeInUnits”更新所有现有的“Delivery”记录,其中我将用单位存储价值

"deliveryAvgMaxTimeInUnits": {
    "value":30,
    "units":"minutes"
}

所以我的数组看起来像这样-

"deliverySubZoneSets" : [ 
            {
                "charges" : {
                    "delivery" : 30,
                    "service" : 0,
                    "packing" : 0,
                    "parking" : 50
                },
                "areas" : [ 
                    ObjectId("5d99c2a93a6a615ff9f7355a")
                ],
                "deliveryAvgMaxTime" : 30,
                "deliveryAvgMaxTimeInUnits": {
                   "value":30,
                   "units":"minutes"
                }
            }
        ]

我可以通过遍历数组然后执行多个更新操作来做到这一点,但我可以在单个 updateMany 查询中做到这一点吗?

【问题讨论】:

  • 您要更新的条件查询是什么?你在使用_ids 的数组吗?
  • @Thee Sritabtim deliverySubZoneSets.length > 0
  • deliveryAvgMaxTimeInUnits 中的值将始终为 30?
  • @PuneetSingh 不,它是动态的。基于 deliveryAvgMaxTime。
  • 我认为不可能在单个查询中完成

标签: node.js mongodb


【解决方案1】:

对于 MongoDB 4.2 或更高版本,您可以执行updates with pipelines

这使您能够根据文档中的当前值更新文档。

对于您的情况,您必须使用 $map$mergeObject

db.collection.updateMany({
  deliverySubZoneSets: { $ne: [] }
}, [
  {
    $set: {
      deliverySubZoneSets: {
        $map: {
          input: "$deliverySubZoneSets",
          in: {
            $mergeObjects: [
              "$$this",
              {
                deliveryAvgMaxTimeInUnits: {
                  value: "$$this.deliveryAvgMaxTime",
                  units: "minutes"
                }
              }
            ]
          }
        }
      }
    }
  }
])

【讨论】:

  • 在 Robo 3T shell 中运行此程序,出现错误无法执行脚本。错误:更新操作文档必须包含原子操作符详情:DBCollection.prototype.updateMany@src/mongo/shell/crud_api.js:625:1 @(shell):1:1
  • 看起来我的数据库版本是 3.4.23。有什么解决办法吗?
  • @Shambhavi_RB 3.4 版已经达到end of life date 建议更新您的版本。否则你将不得不多次调用更新查询
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-29
  • 2020-12-11
  • 1970-01-01
相关资源
最近更新 更多