För att infoga ett dokument om det inte finns görs med upsert och om du vill uppdatera ett villkorligt inbäddat dokument behöver du $ positionsoperator. Så du måste använda båda i fråga för att implementera ovanstående funktionalitet.
Men just nu stöder mongodb inte upserting med $ positional operator
Så det du vill är inte möjligt att göra det i en fråga för närvarande, alternativt kan du göra det i två frågor.
Först
db.collection('ratings').update(
{"refid":refid, "votes.ip": ip},
{
$set: { "votes.$.rating":rating }
}
)
Den returnerar antalet uppdaterade dokument, om det är 1 går det bra, och om det är 0 måste du trycka på ny post.
db.collection('ratings').update( { "refid":refid, "votes.ip":{$ne: ip}},
{$push: { votes: { "ip":ip , "rating":rating }}
})
Det finns också jira-biljett för positionsoperatör och upserting, rösta gärna på den här frågan om du vill ha den här funktionen i mongodb. Nedan är länken för utfärdandet
https://jira.mongodb.org/browse/SERVER-3326
(REDIGERA :Jira-biljetten stängdes med Won't Do i juni 2019)