1

我试图找出如何切换布尔值的“活动”从true到false或false到真基于文档中存在的值。所以如果它是真的,将它改为假,如果它是假的,则将其改为true。示例数组。以编程方式切换布尔值与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'); 
       } 
      }); 

我无法通过将true或false传递到活动{ $set: { active: true }}直接设置此。我将如何测试该值并返回相反的结果?

感谢

回答

1

目前存在的MongoDB没有$拨动操作,因此不可能做出这样的开关操作原子。 但是这种功能有一些解决方法。 首先你需要用数字替换你的布尔值。 然后,不要试图用相反的值替换它,你应该每次都增加它。

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

所以你看,每次这将是$加1,这意味着它总是开关将从偶数奇数。

下一步是修改你的“得到”查询这样:

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

这将返回所有的文件现在在哪里“活动”字段是奇数,你可以考虑像为例如,反之亦然。

+0

感谢@artem抽空回答。该解决方案的工作尽可能findOneAndUpdate()。我不需要$ mod b/c graphql正在处理这个问题,但我很高兴知道它。最后,按照你的建议来做,需要我修改一个模式字段,从布尔到str,所以我去了'''const todos = db.collection('todos'); const oldStatus = await todos.findOne({_id:ObjectID(args.id)}); const newStatus =!oldStatus.active; await todos.findOneAndUpdate({_id:ObjectID(args.id)},{$ set:{active:newStatus}}); return await todos.find()。toArray();'''有没有更好的方法来做到这一点? – idkjs

+0

为什么字符串而不是数字?我其实并不清楚你最终选择了什么解决方案? –

+0

通过查询获取我想要的字段todo.active。创建一个新的var设置为字段的切换值,newValue =!todo.active。然后用新值更新原始文档。不是原子的,还有两次往返,所以我希望可能有另一种方法来解决这个问题。 – idkjs