MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mettre à jour l'objet imbriqué dans MongoDB s'il existe, sinon ajoutez-le

Pour insérer un document s'il n'existe pas, cela se fait par upsert et si vous souhaitez mettre à jour un document incorporé conditionnel, vous avez besoin de l'opérateur positionnel $. Vous devez donc utiliser les deux dans la requête pour implémenter la fonctionnalité ci-dessus.

Mais pour le moment, mongodb ne prend pas en charge l'insertion avec l'opérateur positionnel $

Donc, ce que vous voulez n'est pas possible de le faire en une seule requête pour le moment, sinon vous pouvez le faire en deux requêtes.

Premier

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

Il renvoie le nombre de documents mis à jour, si c'est 1 c'est bon, et si c'est 0, vous devez pousser un nouvel enregistrement.

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

Il y a aussi un ticket jira pour l'opérateur positionnel et l'upserting, veuillez voter pour ce problème si vous voulez cette fonctionnalité dans mongodb. Ci-dessous le lien du problème

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

(MODIFIER  :Le ticket jira a été clôturé avec Won't Do en juin 2019)