根据 MongoDB 中的属性更新嵌套数组对象

Lah*_*ima 4 mongodb mongodb-query

我有一个 MongoDB 集合,其中包含如下所示的文档:

{
    createdTimestamp: 111111111111,
    items: [{
        itemName: 'Name 1',
        quantity: 10
    }, {
        itemName: 'Name 2'
        quantity: 20
    }]
}
Run Code Online (Sandbox Code Playgroud)

现在,我想更新所有文档,以便itemName: 'Name 1'将其更新为itemName: 'New Name'. 更新后,上述文档应如下所示:

{
    createdTimestamp: 111111111111,
    items: [{
        itemName: 'New Name',
        quantity: 10
    }, {
        itemName: 'Name 2'
        quantity: 20
    }]
}
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点,而无需自己迭代所有文档?

Ash*_*shh 7

您需要使用$ positional 运算符来更新数组元素,并且使用multi: true选项可以更新具有相同匹配项的多个文档

db.collection.update(
  { 'items': { '$elemMatch': { 'itemName': 'Name 1' }}},
  { '$set': { 'items.$.itemName': 'New Name' }},
  { 'multi': true }
)
Run Code Online (Sandbox Code Playgroud)

以及 mongodb 3.6 arrayFilters

db.collection.update(
  { 'items': { '$elemMatch': { 'itemName': 'Name 1' }}},
  { '$set': { 'items.$[item].itemName': 'New Name' }},
  { 'arrayFilter': [{ 'item.itemName': 'Name 1' }], 'multi': true }
)
Run Code Online (Sandbox Code Playgroud)