Så du er en del af vejen dertil, men selvfølgelig når du ikke finder en doc
så har du ikke et doc
at arbejde med i tilbagekaldet. MongoDB har indbyggede måder at håndtere denne slags opdateringer på, men du skal selvfølgelig teste for kampen som du er.
Det, vi kan gøre her, er bare at arbejde inden for true
eller false
betingelse for, hvor dokumentet findes.
Overvejer vote.value
at være din true
eller false
for "op-stemmen"
Hvor du finder, at der er et matchende dokument, kan du udstede en opdatering som denne:
Question.update(
{
_id: questionId,
"votes.createdBy" vote.createdBy,
"votes.up": {"$ne": vote.value }
},
{ $set: { "votes.$.up": vote.value } }
);
Så det matcher og bruger en positionel
$
operatør for at sikre det korrekte indeks af den matchende vare opdateres. Det, jeg tilføjede der, sikrer, at du ikke engang rører ved dokumentet, hvor vote.vaule
er allerede af samme værdi.
Og i den falske tilstand vil du $push på arrayet med den nye element:
Question.update(
{
_id: questionId
},
{
$push: {
"votes": {
"up": vote.value,
"createdBy": vote.createdBy
}
}
}
);
Tilføj selvfølgelig tilbagekaldsdetaljerne, hvor writeConcern
anvendes, hvilket du sandsynligvis gør.