Więc jesteś częścią drogi tam, ale oczywiście, gdy nie znajdziesz doc
wtedy nie będziesz mieć doc
do pracy w wywołaniu zwrotnym. MongoDB ma natywne sposoby obsługi tego rodzaju aktualizacji, ale oczywiście musisz przetestować pod kątem dopasowania tak jak ty.
To, co możemy tutaj zrobić, to po prostu pracować w ramach true
lub false
stan, w którym dokument istnieje.
Biorąc pod uwagę vote.value
być Twoim true
lub false
za "głos"
Jeśli okaże się, że istnieje pasujący dokument, możesz wydać aktualizację w następujący sposób:
Question.update(
{
_id: questionId,
"votes.createdBy" vote.createdBy,
"votes.up": {"$ne": vote.value }
},
{ $set: { "votes.$.up": vote.value } }
);
Więc to pasuje i używa pozycyjny
$
operatora, aby upewnić się, że poprawny indeks pasującego elementu zostanie zaktualizowany. To, co tam dodałem, zapewnia, że nawet nie dotkniesz dokumentu, w którym znajduje się vote.vaule
ma już tę samą wartość.
A w fałszywym stanie chcesz $push na tablicę z nowym pozycja:
Question.update(
{
_id: questionId
},
{
$push: {
"votes": {
"up": vote.value,
"createdBy": vote.createdBy
}
}
}
);
Oczywiście dodaj szczegóły wywołania zwrotnego, gdzie writeConcern
jest stosowany, co prawdopodobnie robisz.