Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 불리언 값 토글하기 – findOne()과 update()로 필드 값 반전시키는 방법

MongoDB에서 불리언 값 토글(Toggle)하는 방법

MongoDB는 관계형 데이터베이스처럼 필드 값을 한 번에 반전시키는 전용 토글 연산자를 제공하지 않습니다. 대신 findOne() 메서드로 대상 문서를 먼저 조회한 뒤, update()$set 연산자를 조합하면 불리언(Boolean) 필드의 값을 손쉽게 뒤집을 수 있습니다.

먼저 예제에 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다.

> db.toggleDemo.insertOne({"CustomerName":"John Smith","CustomerAge":28,"isMarried":true});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cc7be138f9e6ff3eb0ce43b")
}
> db.toggleDemo.insertOne({"CustomerName":"David Miller","CustomerAge":25,"isMarried":false});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cc7be2e8f9e6ff3eb0ce43c")
}

find()로 컬렉션의 모든 문서 조회하기

find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.

> db.toggleDemo.find().pretty();

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

{
   "_id" : ObjectId("5cc7be138f9e6ff3eb0ce43b"),
   "CustomerName" : "John Smith",
   "CustomerAge" : 28,
   "isMarried" : true
}
{
   "_id" : ObjectId("5cc7be2e8f9e6ff3eb0ce43c"),
   "CustomerName" : "David Miller",
   "CustomerAge" : 25,
   "isMarried" : false
}

토글 쿼리 실행하기

이제 isMarried 필드의 값을 반전시키는 토글 쿼리를 실행해 보겠습니다. findOne()으로 현재 값을 읽어온 뒤, 논리 부정 연산자(!)를 적용한 결과를 update()로 갱신합니다.

> var value = db.toggleDemo.findOne({CustomerName:"David Miller"});
> db.toggleDemo.update({CustomerName:"David Miller"},{$set:{isMarried:!value.isMarried}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

실행 결과에서 nModified가 1로 표시되었으므로, David Miller 문서의 isMarried 값이 false에서 true로 성공적으로 변경되었음을 알 수 있습니다.

토글 결과 확인하기

isMarried가 false였던 문서가 실제로 true로 변경되었는지, 전체 문서를 다시 조회해 확인해 보겠습니다.

> db.toggleDemo.find().pretty();
{
   "_id" : ObjectId("5cc7be138f9e6ff3eb0ce43b"),
   "CustomerName" : "John Smith",
   "CustomerAge" : 28,
   "isMarried" : true
}
{
   "_id" : ObjectId("5cc7be2e8f9e6ff3eb0ce43c"),
   "CustomerName" : "David Miller",
   "CustomerAge" : 25,
   "isMarried" : true
}

출력 결과를 보면 David Miller 문서의 isMarried 값이 false에서 true로 변경된 것을 확인할 수 있습니다. 이처럼 findOne()으로 현재 값을 가져온 후 $set과 논리 부정(!)을 함께 사용하면 MongoDB에서도 간단하게 토글 기능을 구현할 수 있습니다.

참고: MongoDB 4.2 이상에서는 집계 파이프라인 업데이트 활용 가능

MongoDB 4.2부터는 update 명령에 집계 파이프라인을 사용할 수 있어, 별도의 findOne() 조회 없이 단일 연산으로 원자적(atomic) 토글 처리가 가능합니다. 동시성 문제(경쟁 상태)를 피하고 싶다면 아래 방식이 더 안전합니다.

> db.toggleDemo.updateOne(
   { CustomerName: "David Miller" },
   [ { $set: { isMarried: { $not: "$isMarried" } } } ]
);

이 방법은 조회와 갱신이 하나의 작업으로 처리되므로, 여러 클라이언트가 동시에 같은 문서를 토글하는 상황에서도 값이 꼬이지 않습니다.