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

Mongoose met à jour le sous-document s'il existe

Vous faites donc partie du chemin, mais bien sûr lorsque vous ne trouvez pas de doc alors vous n'aurez pas de doc avec lequel travailler dans le rappel. MongoDB a des moyens natifs de gérer ces types de mises à jour, mais bien sûr, vous devez tester la correspondance comme vous êtes.

Ce que nous pouvons faire ici, c'est simplement travailler dans le true ou false condition de l'endroit où le document existe.

Compte tenu de vote.value être votre true ou false pour le "vote positif"

Lorsque vous trouvez qu'il existe un document correspondant, vous pouvez publier une mise à jour comme celle-ci :

Question.update(
  { 
    _id: questionId, 
    "votes.createdBy" vote.createdBy,
    "votes.up": {"$ne": vote.value }
  },
  { $set: { "votes.$.up": vote.value } }
);

Donc, cela correspond et utilise un positionnel $ opérateur pour s'assurer que le bon index de l'élément correspondant est mis à jour. Ce que j'ai ajouté ici garantit que vous ne touchez même pas le document où le vote.vaule est déjà de la même valeur.

Et dans la condition fausse, vous voulez $push sur le tableau avec le nouveau article :

Question.update(
  { 
    _id: questionId
  },
  { 
    $push: { 
      "votes": {
        "up": vote.value,
        "createdBy": vote.createdBy
      }
    }
  }
);

Bien sûr, ajoutez les détails de rappel où writeConcern est appliqué, ce que vous faites probablement.