Así que eres parte del camino hacia allí, pero, por supuesto, cuando no encuentras un doc
entonces no tendrás un doc
para trabajar con en la devolución de llamada. MongoDB tiene formas nativas de manejar este tipo de actualizaciones, pero, por supuesto, debe probar la coincidencia como eres.
Lo que podemos hacer aquí es simplemente trabajar dentro del true
o false
condición de donde existe el documento.
Teniendo en cuenta vote.value
ser tu true
o false
por el "voto a favor"
Cuando encuentre que hay un documento coincidente, puede emitir una actualización como esta:
Question.update(
{
_id: questionId,
"votes.createdBy" vote.createdBy,
"votes.up": {"$ne": vote.value }
},
{ $set: { "votes.$.up": vote.value } }
);
Entonces eso coincide y usa un positional
$
operador para asegurarse de que el índice correcto del elemento coincidente se actualiza. Lo que agregué allí asegura que ni siquiera toques el documento donde está el vote.vaule
ya tiene el mismo valor.
Y en la condición falsa, desea $push en la matriz con el nuevo elemento:
Question.update(
{
_id: questionId
},
{
$push: {
"votes": {
"up": vote.value,
"createdBy": vote.createdBy
}
}
}
);
Por supuesto, agregue los detalles de devolución de llamada donde writeConcern
se aplica, lo que probablemente hagas.