Mongoose save() не обновляет значение в массиве в документе базы данных
Я пытаюсь обновить документ в коллекции (единицах) с помощью графического интерфейса пользователя и после его обновления. Я хочу обновить значение (user.Units, которое является массивом имен Unit) в коллекции (users). Если длина массива составляет всего один элемент, он обновляется, а также отображается в базе данных, и все работает хорошо, но когда в массиве единиц есть более одного элемента, я пытаюсь обновить его через цикл for, он показывает, что он обновляется, но когда Я проверяю базу данных, она все еще не обновлена.
Я действительно не могу понять, почему он не обновляет базу данных, когда я обновляю значение через цикл.
Функция полного редактирования и обновления: -
edit_unit: function (req, res, next) {
var Data = req.body;
Client_data.Unit.findById(req.params.unitId, function (err, unit) {
var error = false;
if (err) {
error = err;
} else if (!unit) {
error = "FATAL: unable to look up Unit #" + req.params.unitId;
} else {
switch(req.body.name) {
case 'Icon':
var Icon = unit.Icon;
User.find({"Units":Icon}, function (err, users) {
if (err)
console.log(err);
users.forEach(function (u) {
if (u.Units.length > 1) {
for (var i = 0; i <= u.Units.length; i++) {
if(u.Units[i] == Icon) {
u.Units[i] = req.body.value;
}
}
}
else {
u.Units = req.body.value;
}
u.save(u);
});
});
unit[req.body.name] = req.body.value;
break;
case 'Description':
unit[req.body.name] = req.body.value;
break;
default:
unit[req.body.name] = req.body.value;
break;
}
var data = JSON.stringify(req.body);
unit.save();
res.writeHead(200, {
'Content-Length': data.length,
'Content-Type': 'application/json'
});
res.end(data);
}
});
}
req.body: -
{ name: 'Icon',
value: 'Health Utility 22c',
pk: '5395ed107cd92dc40eaafb56'
}
Пользовательская схема: -
var userSchema = mongoose.Schema({
UserName: { type: String, required: true },
Password: { type: String },
FirstName: { type: String, required: true },
LastName: { type: String, required: true },
CompanyName: { type: String },
PhoneNumber: { type: Number },
StartDate: { type: Date, required: true },
EndDate: { type: Date, required: true, default: new Date('9999-12-12') },
ClientID: { type: ObjectId, ref: 'Client', default: null },
DepartmentID: { type: ObjectId, ref: 'Department' },
ManagerID: { type: ObjectId, ref: 'User', default: null},
Units: [ { type: String, required: true } ],
UserList: { type: Array, default:[]},
Access: [{ type: String, enum: ['DEMO', 'USER','MANAGER','ADMINISTRATOR','OWNER']}],
Credentials: { type: String },
AFTE: { type: Number},
SessionID: { type: String, default: null }
}, { safe: true });
Ответы
Ответ 1
Возможно, уведомите mongooose, что набор данных изменился следующим образом:
doc.markModified('pathToYourAttribute')
Из документов http://mongoosejs.com/docs/schematypes.html
person.anything = { x: [3, 4, { y: "changed" }] };
person.markModified('anything');
Надеюсь, что это поможет!
Ответ 2
Обратитесь к этой проблеме. Один из способов решения этой проблемы - не обновлять ваш массив с помощью классического метода индекса массива. Так сделайте это
doc.array.set(index, value);
Вместо
doc.array[index] = value;
также просмотрите FAQ и doc для более подробной информации.