MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Aktualisieren Sie das verschachtelte Objekt in MongoDB, falls vorhanden, andernfalls fügen Sie es hinzu

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)