微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何修改数组中特定子文档中的字段?

如何解决如何修改数组中特定子文档中的字段?

我有一个集合,其中每个文档都有一个包含多个字段的子文档数组。我需要根据其字段更新特定的子文档,但是到目前为止,我所做的每一次尝试都会更改所有排列的子文档中的字段

以下是一些示例数据:

{ 
    '_id' : ObjectId('0001'),'Region' : 'northern',"Items" : [
        {
            "ItemId" : NumberInt(25),"Name" : "Widget","ProductType" : "15","ItemIdLegacy" : "ca-000037"
        },{
            "ItemId" : NumberInt(30),"Name" : "Gizmo","ItemIdLegacy" : "ca-000038"
        },{
            "ItemId" : NumberInt(35),"Name" : "Thingy","ItemIdLegacy" : "ca-000039"
        }
    ] 
}

当我尝试对以下查询使用update()时,它将更新所有数组项的ProductType,而不仅仅是我要更改的项。

为澄清起见,我想将ItemIdLegacy:“ ca-000038”的数组项更改为ProductType:20。所有其他Array项应保持不变。我尝试过的查询

db.Collection.update({"Items.ItemIdLegacy" : "ca-000038"},[{$set: { "Items.ProductType" : "20"} }],{multi: false});

这是所需输出

{ 
    '_id' : ObjectId('0001'),"ProductType" : "20","ItemIdLegacy" : "ca-000039"
        }
    ] 
}

但这是运行该查询的实际输出

{ 
    '_id' : ObjectId('0001'),"ItemIdLegacy" : "ca-000039"
        }
    ] 
}

我觉得我缺少一些简单的东西...

编辑:我有一个问题,可以让我更新数组中的单个匹配元素,但是我需要完成数千个操作,因此一次操作不一定有效(请确保我可以将它们全部解析出来,垃圾邮件到外壳,但我想要更优雅的东西

单个元素更新:

db.Collection.updateOne({"Items.ItemIdLegacy" : "ca-000038"},{ $set: { "Items.$.ProductType" : "20" } } );

解决方法

尝试一下:-

db.collection.update({
  "Items.ItemIdLegacy": "ca-000038"
},{
  $set: {
    "Items.$.ProductType": 20
  }
},{
  multi: true
})

这里是Working Example

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。