Quindi sei parte del percorso, ma ovviamente quando non trovi un doc
allora non avrai un doc
con cui lavorare nella richiamata. MongoDB ha modi nativi per gestire questo tipo di aggiornamenti, ma ovviamente è necessario testare la corrispondenza come sei.
Quello che possiamo fare qui è lavorare all'interno del true
o false
condizione di esistenza del documento.
Considerando vote.value
essere il tuo true
o false
per il "voto positivo"
Laddove trovi un documento corrispondente, puoi emettere un aggiornamento come questo:
Question.update(
{
_id: questionId,
"votes.createdBy" vote.createdBy,
"votes.up": {"$ne": vote.value }
},
{ $set: { "votes.$.up": vote.value } }
);
In modo che corrisponda e utilizzi un posizionale
$
operatore per assicurarsi che l'indice corretto dell'elemento corrispondente viene aggiornato. Quello che ho aggiunto lì fa in modo che tu non tocchi nemmeno il documento in cui si trova vote.vaule
ha già lo stesso valore.
E nella condizione falsa vuoi $push nell'array con il nuovo oggetto:
Question.update(
{
_id: questionId
},
{
$push: {
"votes": {
"up": vote.value,
"createdBy": vote.createdBy
}
}
}
);
Ovviamente aggiungi i dettagli della richiamata dove writeConcern
viene applicato, cosa che probabilmente fai.