Ответ 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 } }
)
Это основные методы и делают это, а также некоторый практический пример того, почему это не может быть сделано в настоящее время в одном утверждении, просто обновляя каждое поле члена массива.