Как обновить значение ключа в списке 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) для перемещения по элементу.


person Shalu    schedule 23.05.2014    source источник


Ответы (1)


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

1. Вы знаете, сколько элементов находится в массиве, поэтому задайте их явно с помощью "точечной нотации".

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

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

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

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

person Neil Lunn    schedule 23.05.2014