1

En essayant de comprendre comment basculer la valeur booléenne de "active" dans l'exemple de true à false ou false à true en fonction de la valeur existant dans le document. Donc, si c'est vrai, changez-le en faux et si c'est faux, changez-le en vrai. Exemple de tableau.Basculer par programme la valeur booléenne avec le pilote natif Mongodb

[{ _id: 59cb78434436be173e038aaa, active: true, title: 'One' }, 
{ _id: 59cb78434436be173e038aab, active: false, title: 'Two' }, 
{ _id: 59cb78434436be173e038aac, active: false, title: 'Three' }] 

const todos = db.collection('todos'); 

const active = !active; 
await todos.findOneAndUpdate({ _id: ObjectID(args.id) }, 
{ $set: { active: active } }, function(err, doc) { 
       if (err) { 
        throw err; 
       } else { 
        console.log('Updated'); 
       } 
      }); 

Je ne peux pas paramétrer directement en passant vrai ou faux à { $set: { active: true }} actif. Comment pourrais-je tester la valeur et retourner le contraire?

Merci

Répondre

1

À l'heure actuelle il n'y a pas d'opérateur à bascule $ dans MongoDB, il est donc impossible de faire une telle opération de commutation atomique. Mais il existe une solution de contournement pour cette fonctionnalité. Tout d'abord, vous devez remplacer votre booléen par le nombre. Ensuite, au lieu d'essayer de le remplacer par la valeur opposée, vous devez simplement l'incrémenter à chaque fois.

todos.findOneAndUpdate({_id: ObjectId(args.id)}, {$inc:{ active: 1}}); 

Donc, vous voyez que chaque fois que ce sera $ augmentée de 1 et cela signifie qu'il sera toujours commutateur de nombre pair à impair.

L'étape suivante consiste à modifier votre requête « get » de cette façon:

todos.find({'active' : { '$mod' : [ 2, 1 ] }); 

Il retournera tous les documents où le champ « actif » est maintenant nombre impair, que vous pouvez considérer comme vrai pour exemple, ou vice versa.

+0

Merci @artem d'avoir pris le temps de répondre. Ces solutions fonctionnaient aussi loin que findOneAndUpdate(). Je n'avais pas besoin de $ mod b/c graphql s'occupait de ça mais j'étais content de l'apprendre. À la fin, le faire comme vous l'avez suggéré, m'a demandé de modifier un champ de schéma de bool à str donc je suis allé avec '' 'const todos = db.collection ('todos'); const oldStatus = wait todos.findOne ({_id: ObjectID (args.id)}); const newStatus =! OldStatus.active; attend todos.findOneAndUpdate ({_id: ObjectID (args.id)}, {$ set: {actif: newStatus}}); return attend todos.find(). ToArray(); '' 'Y a-t-il une meilleure façon de faire cela? – idkjs

+0

Pourquoi une chaîne au lieu d'un numéro? Et je ne comprends pas vraiment quelle solution vous avez finalement choisie? –

+0

Obtenez le champ que je veux, todo.active, avec une requête. Créez un nouveau jeu de variables à la valeur basculée du champ, newValue =! Todo.active. Ensuite, mettez à jour le document d'origine avec la nouvelle valeur. Pas atomique, et deux allers-retours, alors j'espérais qu'il y aurait une autre façon de travailler ça. – idkjs