Um ein Dokument einzufügen, wenn es nicht existiert, erfolgt dies durch Upsert, und wenn Sie ein bedingt eingebettetes Dokument aktualisieren möchten, benötigen Sie den Positionsoperator $. Sie müssen also beide in der Abfrage verwenden, um die obige Funktionalität zu implementieren.
Aber im Moment unterstützt mongodb das Aufwärtseinfügen mit dem Positionsoperator $ nicht
Das, was Sie wollen, ist also derzeit nicht in einer Abfrage möglich, alternativ können Sie es in zwei Abfragen tun.
Zuerst
db.collection('ratings').update(
{"refid":refid, "votes.ip": ip},
{
$set: { "votes.$.rating":rating }
}
)
Es gibt die Anzahl der aktualisierten Dokumente zurück, wenn es 1 ist, ist es in Ordnung, und wenn es 0 ist, müssen Sie einen neuen Datensatz verschieben.
db.collection('ratings').update( { "refid":refid, "votes.ip":{$ne: ip}},
{$push: { votes: { "ip":ip , "rating":rating }}
})
Es gibt auch ein Jira-Ticket für Positionsoperatoren und Upserting. Bitte stimmen Sie für dieses Problem, wenn Sie diese Funktionalität in Mongodb möchten. Unten ist der Link des Problems
https://jira.mongodb.org/browse/SERVER-3326
(BEARBEITEN :Das Jira-Ticket wurde mit Geht nicht geschlossen im Juni 2019)