How to multi update of a nested array in MondoDB?

感情迁移 提交于 2019-12-13 19:18:49

问题


I have documents in a MongoDB 'playground' collection following the below "schema" :

{
  "_id": ObjectId("54423b40c92f9fffb486a6d4"),

  "ProjectFileId": 1,
  "SourceLanguageId": 2,

  "TargetSegments": [
    {
      "LanguageId": 1,
      "Segment": "Something",
      "Colors": [
        1,
        2,
        3
      ],
      "Heights": [
        1,
        2,
        3
      ],
      "Widths": [
        1,
        2,
        3
      ]
    },
    {
      "LanguageId": 1,
      "Segment": "Something",
      "Colors": [
        1,
        2,
        3
      ],
      "Heights": [
        1,
        2,
        3
      ],
      "Widths": [
        1,
        2,
        3
      ]
    }
  ]
}

And the following update query:

db.playground.update({
  $and: [
    {
      "TargetSegments.Colors": {
        $exists: true
      }
    },
    {
       "ProjectFileId": 1
    },
    {
      "SourceLanguageId": 2
    },
    {
      "TargetSegments": {
        $elemMatch: {
          "LanguageId": 1
        }
      }
    }
  ]
},
{
  $set: {
    "TargetSegments.$.Segment": null,
    "TargetSegments.$.Colors": [],
    "TargetSegments.$.Widths": [],
    "TargetSegments.$.Heights": []
  }
},
false, true)

After the execution of the query the result is:

{
  "_id": ObjectId("54423b40c92f9fffb486a6d4"),

  "ProjectFileId": 1,
  "SourceLanguageId": 2,

  "TargetSegments": [
    {
      "LanguageId": 1,
      "Segment": null,
      "Colors": [],
      "Heights": [],
      "Widths": []
    },
    {
      "LanguageId": 1,
      "Segment": "Something",
      "Colors": [
        1,
        2,
        3
      ],
      "Heights": [
        1,
        2,
        3
      ],
      "Widths": [
        1,
        2,
        3
      ]
    }
  ]
}

As you can see, only the first element of the "TargetSegments" array is updated.

How can I update all the elements of the TargetSegments array in one update query?


回答1:


Its because you are using $ operator: The positional $ operator identifies an element (not multi) in an array to update without explicitly specifying the position of the element in the array. To project, or return, an array element from a read operation, see the $ projection operator.

You can use below code to do it:

db.playground.find({
  $and: [
    {
      "TargetSegments.Colors": {
        $exists: true
      }
    },
    {
       "ProjectFileId": 1
    },
    {
      "SourceLanguageId": 2
    },
    {
      "TargetSegments": {
        $elemMatch: {
          "LanguageId": 1
        }
      }
    }
  ]
}).forEach(function(item)
{
    var targets = item.TargetSegments;

    for(var index = 0; index < targets.length; index++)
    {
        var target = targets[index];
        target.Segment = null,
        target.Colors= [],
        target.Widths= [],
        target.Heights= []
    }

    db.playground.save(item);
});


来源:https://stackoverflow.com/questions/26438864/how-to-multi-update-of-a-nested-array-in-mondodb

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!