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'); 
       } 
      }); 

{ $set: { active: true }}에 true 또는 false를 전달하여 직접 설정할 수 없습니다. 어떻게하면 가치를 테스트하고 그 반대를 반환할까요?

감사 순간

답변

1

가 MongoDB의에는 $ 토글 운영자가 없다, 그래서는 스위치 작업이 원자 수 있도록하는 것은 불가능합니다. 그러나이 기능에는 몇 가지 해결 방법이 있습니다. 먼저 boolean을 숫자로 바꿔야합니다. 그런 다음 반대 값으로 바꾸지 말고 매번 증가시켜야합니다.

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

그래서 당신은 1 씩 증가 $ 될 것이다 매번를보고 그것이 홀수에 짝수를 항상 스위치 의미합니다.

다음 단계는 이런 방식으로 '얻을'쿼리를 수정하는 것입니다 :

todos.find({'active' : { '$mod' : [ 2, 1 ] }); 
'활성'필드 당신이 사실처럼 고려할 수 홀수, 지금 곳은 모든 문서를 반환합니다

예를 들어, 또는 그 반대로.

+0

답장 시간을내어 주신 Thanks @artem. 그 해결책은 findOneAndUpdate()까지 작동했습니다. 나는 $ mod b/c graphql을 처리 할 필요가 없었지만 그것을 배우게되어 기뻤다. 결국, 당신이 제안한 것처럼, 나는 bool에서 str으로 스키마 필드를 수정해야했기 때문에'''const todos = db.collection ('todos'); const oldStatus = todos.findOne을 기다립니다 ({_id : ObjectID (args.id)}); const newStatus =! oldStatus.active; todos.findOneAndUpdate ({_id : ObjectID (args.id)}, {$ set : {활성 : newStatus}})를 기다리고 있습니다. return todos.find(). toArray();'''이 작업을 수행하는 더 좋은 방법이 있습니까? – idkjs

+0

숫자 대신 문자열을 사용해야하는 이유는 무엇입니까? 그리고 실제로 당신이 마침내 선택한 솔루션을 분명히 이해하지 못합니까? –

+0

필드를 가져 오려면 todo.active를 쿼리로 가져옵니다. 필드의 토글 된 값인 newValue =! todo.active를 생성합니다. 그런 다음 원본 문서를 새 값으로 업데이트하십시오. 원자력이 아니고 두 번의 왕복 여행이 있었기 때문에 나는 또 다른 방법이있을 수 있기를 바랬다. – idkjs