Pregunta

Estoy rascando la cabeza aquí, como de costumbre parece con proyectos de nodo, y no estoy seguro de si estoy haciendo algo mal o si me he encontrado con un error.

Tengo un esquema de servidor que puede tener cualquier cantidad de documentos integrados llamados Servicios. Sin embargo, me estoy encontrando con un problema en el que, a pesar de que he eliminado con éxito el servicio individual del objeto del servidor, cuando le digo que lo guarde no lo elimine de la base de datos. La función Guardar está funcionando porque está guardando cualquier cambio que haya realizado y también está presionando en nuevos documentos integrados, simplemente no elimina uno que ya está allí.

Aquí hay un ejemplo relativamente simplificado de mi código:

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

Entonces el remoje () en realidad está eliminando el servicio. Si hago un servidor.toObject () antes de guardar, no está allí. ¿Alguna idea de por qué no lo eliminaría de la base de datos cuando salva?

Editar: supongo que los números de versión serían útiles. node@0.4.2, mongoose@1.1.5 express@2.0.0rc

¿Fue útil?

Solución

Encontré una manera de solucionar temporalmente este problema.

Lo que hice es cargar los documentos incrustados en una matriz, empalmar el que se eliminará y reemplazar la matriz. Algo como esto:

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

Sé que dependiendo del tamaño del documento que

Otros consejos

Podría estar equivocado, ya que no he probado su ejemplo, pero esto parece que Mongoose no está detectando que el documento incrustado se modifique.

Desde el Página de documentación de tipos de esquema:

Como es un tipo sin esquema, puede cambiar el valor a cualquier otra cosa que desee, pero La mangosta pierde la capacidad de detectar/guardar automáticamente esos cambios. Para "decir" la mangosta que el valor de un tipo mixto ha cambiado, Llame a .markModified (ruta) Método del documento que pasa la ruta al tipo mixto que acaba de cambiar.

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

Por lo tanto, su respuesta puede ser tan simple como usar la función MarkModified ().

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top