Aby wstawić dokument, jeśli nie istnieje, jest to wykonywane przez upsert, a jeśli chcesz zaktualizować osadzony dokument warunkowy, potrzebujesz operatora pozycyjnego $. Musisz więc użyć obu w zapytaniu, aby zaimplementować powyższą funkcjonalność.
Ale obecnie mongodb nie obsługuje zamiany z operatorem pozycyjnym $
Więc to, czego chcesz, nie jest na razie możliwe do wykonania w jednym zapytaniu, alternatywnie możesz to zrobić w dwóch zapytaniach.
Najpierw
db.collection('ratings').update(
{"refid":refid, "votes.ip": ip},
{
$set: { "votes.$.rating":rating }
}
)
Zwraca liczbę zaktualizowanych dokumentów, jeśli wynosi 1, to w porządku, a jeśli jest 0, musisz przekazać nowy rekord.
db.collection('ratings').update( { "refid":refid, "votes.ip":{$ne: ip}},
{$push: { votes: { "ip":ip , "rating":rating }}
})
Istnieje również ticket jira dla operatora pozycyjnego i upsertingu, proszę głosujcie na ten problem, jeśli chcecie tę funkcjonalność w mongodb. Poniżej znajduje się link do problemu
https://jira.mongodb.org/browse/SERVER-3326
(EDYTUJ :bilet jira został zamknięty za pomocą Nie zrobię w czerwcu 2019)