如何在MondoDB中多重更新嵌套数组? [英] How to multi update of a nested array in MondoDB?

查看:129
本文介绍了如何在MondoDB中多重更新嵌套数组?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在MongoDB游乐场"集合中的文档遵循以下模式":

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
      ]
    }
  ]
}

以及以下更新查询:

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)

执行查询后,结果为:

{
  "_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
      ]
    }
  ]
}

如您所见,只有"TargetSegments"数组的第一个元素被更新.

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

如何在一个更新查询中更新TargetSegments数组的所有元素?

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

推荐答案

这是因为您使用的是$运算符:位置$运算符标识了数组中的一个元素(不是多元素),而无需显式更新指定元素在数组中的位置.要从读取操作中投影或返回数组元素,请参见$ projection运算符.

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);
});

这篇关于如何在MondoDB中多重更新嵌套数组?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆