使用Mongodb Native Driver

时间:2017-09-27 10:17:21

标签: javascript mongodb boolean mongodb-query node-mongodb-native

我试图弄清楚如何切换"活跃"的布尔值。在示例中,从true到false或false到true,基于文档中存在的值。因此,如果为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传递给活动{ $set: { active: true }}来直接设置它。我如何测试该值并返回相反的值?

由于

1 个答案:

答案 0 :(得分:1)

目前MongoDB中没有$ toggle运算符,因此无法使这种切换操作成为原子。 但是这种功能有一些解决方法。 首先,你需要用数字替换你的布尔值。 然后,不要试图用相反的值替换它,而应该每次都增加它。

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

所以你看到每次它会以$递增1,这意味着它总是从<偶数切换到奇数。

下一步是修改你的&#39; get&#39;以这种方式查询:

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

它会返回所有活跃的文件。字段现在是奇数,您可以将其视为 true ,反之亦然。