【问题标题】:MongoDB 4.2.1 - updateMany: Error: the update operation document must contain atomic operatorsMongoDB 4.2.1 - updateMany:错误:更新操作文档必须包含原子操作符
【发布时间】:2020-03-16 05:13:57
【问题描述】:

所以我在使用 Robo 3T 的 mongodb 4.2.1 中遇到了这个问题。 我想通过在另一个对象中移动一个字段来更新特定文档。

像这样使用update() 效果很好。

db.getCollection('myCollections').update(
    {
        randomId: ObjectId("......."),
    },
    [
        { $set: { "myObject.myField": "$myField" } },
        { $unset: [ "myField" ] }
    ])

但是当我想像这样使用updateMany() 更新我的所有文档时。

db.getCollection('myCollections').updateMany(
    {
        randomId: ObjectId("......."),
    },
    [
        { $set: { "myObject.myField": "$myField" } },
        { $unset: [ "myField" ] }
    ])

我有一个错误

Failed to execute script.

Error: the update operation document must contain atomic operators 
Details:
DBCollection.prototype.updateMany@src/mongo/shell/crud_api.js:625:1
@(shell):1:1

我没有尝试使用 shell,但我想它会告诉我同样的事情。

编辑

之前的文档示例

{
  _id: ...,
  randomId: ObjectId(...),
  myField: 0.5
  myObject: {
    value1: 1,
    ...
  }
  ...
}

之后

{
  _id: ...,
  randomId: ObjectId(...),
  myObject: {
    value1: 1,
    myField: 0.5,
    ...
  }
  ...
}

【问题讨论】:

    标签: mongodb robo3t


    【解决方案1】:

    这是为了帮助那些像我一样犯下离开 $set 错误的人。

    所以它给了我在问题中指定的相同错误消息。

    在查询中也附加 $set

    之前:

    db.myData.updateOne({key:"value"},{key:"new-value"})
    

    之后:

    db.myData.updateOne({key:"value"},{$set:{key:"new-value"}}) 
    

    然后我就可以更新我的数据了。

    【讨论】:

      【解决方案2】:

      使用$rename更新文档更新操作符;它只是重命名字段。

      db.upd.updateOne(
        { randomId: ObjectId("xyz")},
        { $rename: { myField: "myObject.myField" } }
      }
      

      【讨论】:

        【解决方案3】:

        我的错。我刚刚尝试使用 mongo shell,它工作正常。应该停止使用 robo 3T 进行更新。

        抱歉打扰,感谢您的回答

        【讨论】:

        • 我遇到了同样的问题,结果证明这是一个 Studio 3T 错误。你有没有报告过?
        • 在 Robo 3T 1.3 中仍然存在问题。尝试使用 mongo shell 并运行。
        • 1.3.1 - 2021 - 仍然有问题
        • 面对相同的:(
        • 这不是“你的坏”,这是一个错误。不是你的错。
        【解决方案4】:

        updateOne()updateMany()的第二个参数必须是Object,所以基本上你使用了错误的语法,试试这样吧:

        db.getCollection('myCollections').updateMany({
            randomId: ObjectId("......."),
        }, {
            $set: {
                "myObject.myField": "$myField"
            },
            $unset: {
                "myField": 1
            }
        })
        

        【讨论】:

        • 所以更新工作正常但不是myObject.myField 中的myField 值,我有一个字符串$myField 用于所有更新的文档。对于updateMany 的第二个参数,我想使用文档中所说的聚合管道,您需要使用以下语法:[ <stage1>, ... ]。似乎获得myField 值的唯一方法是使用聚合管道。
        • 很抱歉缺乏理解,但您到底想达到什么目的?
        • 没问题:D。我刚刚用一些我想做的例子更新了我的问题。
        猜你喜欢
        • 1970-01-01
        • 2016-12-17
        • 2019-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多