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 }}
直接设置此。我将如何测试该值并返回相反的结果?
感谢
感谢@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
为什么字符串而不是数字?我其实并不清楚你最终选择了什么解决方案? –
通过查询获取我想要的字段todo.active。创建一个新的var设置为字段的切换值,newValue =!todo.active。然后用新值更新原始文档。不是原子的,还有两次往返,所以我希望可能有另一种方法来解决这个问题。 – idkjs