Монгуз не удаляет встроенные документы
Вопрос
Я царапаю здесь свою голову, как обычно, это кажется проектами узлов, и я не уверен, что я делаю что -то не так или сталкиваюсь с ошибкой.
У меня есть схема сервера, которая может иметь любое количество встроенных документов, называемых службами. Я сталкиваюсь с проблемой, хотя, хотя я успешно удалил отдельную службу из объекта сервера, когда я говорю ему сохранить, он не удаляет ее из базы данных. Функция сохранения работает, потому что она сохраняет любые изменения, которые я внес, а также выдвигает новые встроенные документы, это просто не удаляет то, что уже есть.
Вот относительно упрощенный пример моего кода:
app.put('/server/:id', function(req, res, next){
app.Server.findOne({_id: req.params.id}, function(err, server) {
server.updated = new Date();
...
for (var num = _.size(req.body.server.services) - 1; num >= 0; num--){
// Is this a new service or an existing one
if (server.services[num]) {
// Is it marked for deletion? If so, delete it
if (req.body.server.services[num].delete == "true") {
server.services[num].remove()
} else { // else, update it
server.services[num].type = req.body.server.services[num].type
...
}
} else {
// It's new, add it
delete req.body.server.services[num]["delete"]
server.services.push(req.body.server.services[num]);
}
}
server.save(function(err){
if (!err) {
req.flash('success', 'Server updated')
} else {
req.flash('error', 'Err, Something broke when we tried to save your server. Sorry!')
console.log(err)
}
res.redirect('/')
});
})
});
Таким образом, remote () фактически удаляет услугу. Если я сделаю server.tobject () до сохранения, его там нет. Любые идеи, почему это не удаляет его из базы данных, когда он сохраняет?
РЕДАКТИРОВАТЬ: Полагаю, номера версий будут полезны. node@0.4.2, mongoose@1.1.5 express@2.0.0rc
Решение
Я нашел способ временного решения этой проблемы.
То, что я сделал, это загрузил встроенные документы в массив, разбивайте тот, который должен быть удален и заменить массив. Что-то вроде этого:
var oldusers = dl.users;
oldusers.splice(dl.users.indexOf(req.currentUser.id), 1);
dl.users = oldusers;
dl.save(function(err) {...
Я знаю, что в зависимости от размера документа он будет
Другие советы
Я мог бы ошибаться, так как я не проверил ваш пример, но это звучит так, что Mongoose не обнаруживает, что встроенный документ изменен.
От Страница документации типов схемы:
Поскольку это тип без схемы, вы можете изменить ценность на все, что вам нравится, но Mongoose теряет способность автоматически обнаружить/сохранить эти изменения. Анкет «Сказать» мангуз, что значение смешанного типа изменилось, Позвоните. Метод документа, передавая путь к смешанному типу, который вы только что изменили.
person.anything = { x: [3, 4, { y: "changed" }] };
person.markModified('anything');
person.save(); // anything will now get saved
Таким образом, вы ответите, может быть так же просто, как использование функции Markmodified ().