10
votes

UpdateOne renvoie un objet mangouste et non un document

Lors de l'exécution de cette requête:

{ n: 1, nModified: 1, ok: 1 }

La réponse que j'obtiens est la suivante:

  const project = await models.Projects
    .updateOne(
      { _id: projectId },
      {
        $addToSet:
        {
          membersIds:
          {
            $each: membersIds
          },
        },
      },
    );

Est-il possible d'obtenir un objet mis à jour au lieu de ces données de mangouste?


0 commentaires

3 Réponses :


7
votes

De la documentation : [callback] «Function» params are (error, writeOpResult) ce qui signifie qu'il n'y a aucun moyen de retourner un document avec la méthode updateOne .

Au lieu de updateOne il est cependant possible d'utiliser findByIdAndUpdate en fournissant l'option lean: true


0 commentaires

1
votes

Si vous n'utilisez pas le document après l'opération de mise à jour, vous devez utiliser updateOne , c'est plus rapide. Pourtant; si vous avez besoin d'un document mis à jour, vous devez utiliser findByIdAndUpdate ou findOneAndUpdate . Vous pouvez filtrer uniquement avec _id avec findByIdAndUpdate, mais vous pouvez utiliser tous les filtres de champs existants avec findOneAndUpdate .


0 commentaires

2
votes

ATTENTION !

J'ai vu les réponses, elles vont bien, MAIS , faites attention à ajouter la nouvelle option et à la définir comme vraie dans la requête pour obtenir le nouveau document mis à jour, sinon il renverra le document avant la mise à jour:

    models.Projects.findByIdAndUpdate(
    { "_id": projectId }, 
    { $addToSet:{ membersIds: { $each: membersIds }}})
   .exec()
   .then((response) => {
          console.log('document before updating =>', response);
        });

    models.Projects.findByIdAndUpdate(
        { "_id": projectId }, 
        { $addToSet:{ membersIds: { $each: membersIds }}}, 
        {new: true})
       .exec()
       .then((response) => {
              console.log('document after updating =>', response);
            });


0 commentaires