For at indsætte et dokument, hvis det ikke eksisterer, gøres ved upsert, og hvis du vil opdatere et betinget indlejret dokument, skal du bruge $ positional operator. Så du skal bruge begge i forespørgslen for at implementere ovenstående funktionalitet.
Men lige nu understøtter mongodb ikke upserting med $ positional operator
Så det, du ønsker, er ikke muligt at gøre det i én forespørgsel i øjeblikket, alternativt kan du gøre det i to forespørgsler.
Først
db.collection('ratings').update(
{"refid":refid, "votes.ip": ip},
{
$set: { "votes.$.rating":rating }
}
)
Det returnerer antallet af opdaterede dokumenter, hvis det er 1 er det fint, og hvis det er 0, skal du skubbe ny rekord.
db.collection('ratings').update( { "refid":refid, "votes.ip":{$ne: ip}},
{$push: { votes: { "ip":ip , "rating":rating }}
})
Der er også jira-billet til positional operator og upserting, plz stem på dette problem, hvis du vil have denne funktionalitet i mongodb. Nedenfor er linket til problemet
https://jira.mongodb.org/browse/SERVER-3326
(EDIT :Jira-billetten blev lukket med Won't Do i juni 2019)