Mongoose не будет удалять вложенные документы - PullRequest
7 голосов
/ 15 марта 2011

Я почесываю голову здесь, как обычно, как это бывает с проектами узлов, и я не уверен, что делаю что-то не так или столкнулся с ошибкой.

У меня есть схема сервера, которая может иметь любое количество встроенных документов, называемых сервисами.Однако я сталкиваюсь с проблемой, когда, несмотря на то, что я успешно удалил отдельную службу из объекта сервера, когда я говорю, что она сохраняется, она не удаляется из базы данных.Функция сохранения работает, потому что она сохраняет все сделанные мной изменения, а также добавляет новые встроенные документы, просто не удаляя те, которые уже есть.

Вот сравнительно упрощенный пример моего кода:

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('/')
    });
  })
});

Таким образом, remove () фактически удаляет службу.Если я сделаю server.toObject () перед сохранением, его там нет.Любые идеи, почему он не будет удалять его из базы данных при сохранении?

Редактировать: Я полагаю, номера версий будут полезны.node@0.4.2, mongoose@1.1.5 express@2.0.0rc

Ответы [ 2 ]

5 голосов
/ 25 октября 2011

Я могу ошибаться, поскольку я не проверял ваш пример, но похоже, что Mongoose не обнаруживает, что встроенный документ изменен.

Со страницы документации по типам схемы :

Поскольку это тип без схемы, вы можете изменить значение на что угодно, кроме Mongooseтеряет способность автоматически обнаруживать / сохранять эти изменения .Чтобы «сообщить» Mongoose, что значение смешанного типа изменилось, вызовите метод .markModified (path) документа, передавая путь к смешанному типу, который вы только что изменили.

person.anything = { x: [3, 4, { y: "changed" }] };
person.markModified('anything');
person.save(); // anything will now get saved

Таким образом, вы можете ответить так же просто, как использовать функцию markModified ().

3 голосов
/ 19 марта 2011

Я нашел способ временного решения этой проблемы.

Что я сделал, так это загрузил внедренные документы в массив, склеил тот, который нужно удалить, и заменил массив.Примерно так:

var oldusers = dl.users;
oldusers.splice(dl.users.indexOf(req.currentUser.id), 1);
dl.users = oldusers;
dl.save(function(err) {...

Я знаю, что в зависимости от размера документа это будет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...