MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Aggiorna l'oggetto nidificato in MongoDB se esiste, altrimenti aggiungilo

Per inserire un documento se non esiste si fa upsert e se si vuole aggiornare un documento embedded condizionale è necessario $ operatore posizionale. Quindi è necessario utilizzare entrambi nella query per implementare la funzionalità di cui sopra.

Ma al momento mongodb non supporta l'upserting con $ operatore posizionale

Quindi quello che vuoi non è possibile farlo in una query per ora, in alternativa puoi farlo in due query.

Primo

db.collection('ratings').update(
  {"refid":refid, "votes.ip": ip},
  {
     $set: { "votes.$.rating":rating }
  }
)

Restituisce il numero di documenti aggiornati, se è 1 va bene e se è 0 è necessario eseguire il push del nuovo record.

db.collection('ratings').update( { "refid":refid, "votes.ip":{$ne: ip}},
    {$push: { votes: { "ip":ip , "rating":rating  }}
})

C'è anche il biglietto jira per l'operatore posizionale e l'upserting, per favore vota per questo problema se vuoi questa funzionalità in mongodb. Di seguito il link del problema

https://jira.mongodb.org/browse/SERVER-3326

(MODIFICA :Il ticket jira è stato chiuso con Won't Do a giugno 2019)