2011-11-03 26 views
10

Tengo un problema con la actualización de documentos incrustados.Mongoose embedded document updating

Mis esquemas definidos:

var Talk = new Schema({ 
    title: { 
     type: String, 
     required: true 
    }, 
    content: { 
     type: String, 
     required: true 
    }, 
    date: { 
     type: Date, 
     required: true 
    }, 
    comments: { 
     type: [Comments], 
     required: false 
    }, 
    vote: { 
     type: [VoteOptions], 
     required: false 
    }, 
}); 

var VoteOptions = new Schema({ 
    option: { 
     type: String, 
     required: true 
    }, 
    count: { 
     type: Number, 
     required: false 
    } 
}); 

Ahora me gustaría actualizar vote.count++, con dada Talk Identificación y VoteOption ID. Tengo la siguiente función para hacer el trabajo:

function makeVote(req, res) { 

    Talk.findOne(req.params.id, function(err, talk) { 
     for (var i = 0; i < talk.vote.length; i++) { 
      if (talk.vote[i]._id == req.body.vote) { 
       talk.vote[i].count++; 

      } 
     } 
     talk.save(function(err) { 
      if (err) { 
       req.flash('error', 'Error: ' + err); 
       res.send('false'); 
      } else { 
       res.send('true'); 
      } 
     }); 
    }); 
} 

Todo lo ejecuta, yo recuperar el res.send('true'), pero el valor de recuento no cambia.

Cuando hice algo de console.log vi que cambió el valor, pero el talk.save simplemente no lo guarda en db.

También estoy bastante descontento con el ciclo solo para encontrar _id de embedded doc. En la documentación de la mangosta, leí acerca de talk.vote.id(my_id), pero eso me da el error de no tener una función id.

Respuesta

19

Al actualizar un tipo Mixed (que parece ser algo más que un tipo básico, por lo que también incluye documentos incrustados), se debe llamar al .markModified en el documento. En este caso, sería:

talk.markModified("vote"); // mention that `talk.vote` has been modified 

talk.save(function(err) { 
    // ... 
}); 

Espero que esto ayude a alguien en el futuro ya que no pude encontrar la respuesta muy rápidamente.


Reference:

... Mangosta pierde la capacidad de detectar/guardar esos cambios automática. Para "decirle" a Mongoose que el valor de un tipo mixto ha cambiado, llame al método .markModified(path) del documento que pasa la ruta al tipo mixto que acaba de cambiar.

+0

Hero of the day! – MrBr

0

Esto se debe a que está intentando guardar su objeto de conversación antes de la devolución de llamada, cuyo recuento de incrementos se ha disparado. Además, ¿se aseguró de crear una instancia de su esquema de conversación? por ejemplo:

var talk = new Talk(); 

Sin embargo, si lo que quieres hacer es incremento de la variable de recuento, mongo apoya atómicas, en lugar cambios, que pueden serle de utilidad:

talk.find({ _id : req.body.vote }, { $inc: { count : 1 } }); 

echar un vistazo a: http://www.mongodb.org/display/DOCS/Updating#Updating-%24inc