Per inserire un documento se non esiste si fa upsert e se si vuole aggiornare un documento embedded condizionale è necessario $ operatore posizionale. Quindi è necessario utilizzare entrambi nella query per implementare la funzionalità di cui sopra.
Ma al momento mongodb non supporta l'upserting con $ operatore posizionale
Quindi quello che vuoi non è possibile farlo in una query per ora, in alternativa puoi farlo in due query.
Primo
db.collection('ratings').update(
{"refid":refid, "votes.ip": ip},
{
$set: { "votes.$.rating":rating }
}
)
Restituisce il numero di documenti aggiornati, se è 1 va bene e se è 0 è necessario eseguire il push del nuovo record.
db.collection('ratings').update( { "refid":refid, "votes.ip":{$ne: ip}},
{$push: { votes: { "ip":ip , "rating":rating }}
})
C'è anche il biglietto jira per l'operatore posizionale e l'upserting, per favore vota per questo problema se vuoi questa funzionalità in mongodb. Di seguito il link del problema
https://jira.mongodb.org/browse/SERVER-3326
(MODIFICA :Il ticket jira è stato chiuso con Won't Do a giugno 2019)