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)