Vložení dokumentu, pokud neexistuje, se provádí pomocí upsert a pokud chcete aktualizovat podmíněně vložený dokument, potřebujete poziční operátor $. K implementaci výše uvedené funkce tedy musíte v dotazu použít obojí.
Momentálně ale mongodb nepodporuje upserting pomocí $ pozičního operátoru
Takže to, co chcete, zatím není možné udělat v jednom dotazu, případně to můžete udělat ve dvou dotazech.
První
db.collection('ratings').update(
{"refid":refid, "votes.ip": ip},
{
$set: { "votes.$.rating":rating }
}
)
Vrací počet aktualizovaných dokumentů, pokud je 1, je to v pořádku, a pokud je 0, musíte odeslat nový záznam.
db.collection('ratings').update( { "refid":refid, "votes.ip":{$ne: ip}},
{$push: { votes: { "ip":ip , "rating":rating }}
})
Existuje také jira ticket pro poziční operátor a upserting, hlasujte prosím pro toto vydání, pokud chcete tuto funkcionalitu v mongodb. Níže je odkaz na vydání
https://jira.mongodb.org/browse/SERVER-3326
(UPRAVIT :Vstupenka jira byla uzavřena pomocí Nebudu dělat v červnu 2019)