Javascript 使用Mongodb本机驱动程序以编程方式切换布尔值

Javascript 使用Mongodb本机驱动程序以编程方式切换布尔值,javascript,mongodb,boolean,mongodb-query,node-mongodb-native,Javascript,Mongodb,Boolean,Mongodb Query,Node Mongodb Native,我想知道如何根据文档中存在的值将示例中“active”的布尔值从true切换到false或从false切换到true。所以如果它是真的,就把它改成假的,如果它是假的,就把它改成真的。示例数组 [{ _id: 59cb78434436be173e038aaa, active: true, title: 'One' }, { _id: 59cb78434436be173e038aab, active: false, title: 'Two' }, { _id: 59cb78434436be173e0

我想知道如何根据文档中存在的值将示例中“active”的布尔值从true切换到false或从false切换到true。所以如果它是真的,就把它改成假的,如果它是假的,就把它改成真的。示例数组

[{ _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传递给active
{$set:{active:true}}
来直接设置它。如何测试该值并返回相反的值


感谢目前MongoDB中没有$toggle操作符,因此不可能使这种切换操作原子化。 但是对于这个功能有一些变通方法。 首先,您需要将布尔值替换为数字。 然后,不要试图用相反的值替换它,而应该每次递增它

todos.findOneAndUpdate({_id: ObjectId(args.id)}, {$inc:{ active: 1}});
所以你可以看到每次它都是$1加1,这意味着它总是从偶数变为奇数

下一步是以以下方式修改“get”查询:

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

它将返回所有“活动”字段现在为奇数的文档,例如,您可以认为是真的,反之亦然。

谢谢@ AtTEM花时间回答。该解决方案在findOneAndUpdate()中一直有效。我不需要$mod b/c graphql来处理这个问题,但我很高兴了解到这一点。最后,按照您的建议执行,需要我将模式字段从bool修改为str,因此我使用了
const todos=db.collection('todos');constoldstatus=wait todos.findOne({u id:ObjectID(args.id)});const newStatus=!oldStatus.active;等待todos.findOneAndUpdate({u id:ObjectID(args.id)},{$set:{active:newStatus}});return wait todos.find().toArray()有更好的方法吗?为什么是字符串而不是数字?实际上,我并不清楚您最终选择了什么解决方案?通过查询获取我想要的字段todo.active。创建一个新的变量集以切换字段的值,newValue=!待办事项。然后用新值更新原始文档。不是原子弹,还有两次往返,所以我希望有另一种方法可以做到这一点。