Mongoose не удалит встроенные документы

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

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

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

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 () перед сохранением, его там не будет. Есть идеи, почему бы не удалить его из базы данных при сохранении?

Изменить: Я полагаю, что номера версий будут полезны. Мы создали и внедряют новые встроенные документы, просто не удаляя уже существующие.

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

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 () перед сохранением, его там не будет. Есть идеи, почему бы не удалить его из базы данных при сохранении?

Edit: Я полагаю, что номера версий были бы полезны. Мы создали и внедряют новые встроенные документы, просто не удаляя уже существующие.

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

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

7
задан mattmcmanus 15 March 2011 в 21:24
поделиться