Как обновить значение ключа в списке json в Mongo

У меня есть документ ---

   Employees:[
       {
          name:"abc",
          contact:"123",
          email:"[email protected]"
       },
       {
          name:"efg",
          contact:"456",
          email:"[email protected]"
       },
       {
          name:"hij",
          contact:"789",
          email:"[email protected]"
       }
  ]

Мне нужно обновить имя со значением = "abc" для всех имен ключей в списке.

Я попытался обновить, например

db.collection.update(
    { "_id" : ObjectId("5308595e3256e758757b4d2f") }, 
    { "$set": { "Employees.name " : "abc" } } 
);

Но получение ошибки: нельзя использовать часть (Employees of Employees.name) для перемещения элемента.

Ответ 1

Они находятся в массиве, поэтому ваш текущий оператор не работает. У вас есть несколько вариантов для этого, поскольку для этого нет простого утверждения.

1. Вы знаете, сколько элементов в массиве, поэтому установите их явно с помощью "dot-notation"

    db.collection.update(
        { "_id" : ObjectId("5308595e3256e758757b4d2f") }, 
        { 
            "$set": { 
                "Employees.0.name " : "abc",
                "Employees.1.name " : "abc",
                "Employees.2.name " : "abc"
            }
        } 
    );

2.. Вы не знаете, но готовы опубликовать это обновление до тех пор, пока возвращаемые "измененные" документы не станут 0. Тогда вы можете использовать оператор position $ в обновлении, но это будет только когда-либо совпадают по одному элементу за раз:

     db.collection.update(
        { 
            "_id" : ObjectId("5308595e3256e758757b4d2f"),
            "Employees.name": { "$ne": "abc" }
        }, 
        { 
            "$set": { 
                "Employees.$.name " : "abc"
            }
        } 
    );

3. Извлеките документ и обновите все элементы массива в коде:

    var doc = db.collection.findOne({ 
        "_id": ObjectId("5308595e3256e758757b4d2f") 
    });

    doc.Employee.forEach(function(emp) {
        emp.name = "abc";
    });
    db.collection.update(
       { "_id": doc._id },
       { "$set": { "Employee": doc.Employeee } }
    )

Это основные методы и делают это, а также некоторый практический пример того, почему это не может быть сделано в настоящее время в одном утверждении, просто обновляя каждое поле члена массива.