MongoDB에서 조건과 일치하지 않는 요소 제거하기
배열에서 특정 조건과 일치하지 않는 요소를 제거하려면 $pull 연산자를 사용하고, 조건을 지정할 때는 $ne 연산자를 활용합니다. MongoDB의 $ne는 필드 값이 지정된 값과 같지 않은 문서를 선택하는 비교 연산자로, 이 두 연산자를 함께 사용하면 원하는 조건에 맞지 않는 배열 요소를 손쉽게 삭제할 수 있습니다.
1. 샘플 컬렉션 생성하기
먼저 테스트용 문서가 포함된 컬렉션을 생성해 보겠습니다.
> db.demo410.insertOne(
... {
... details: [{isMarried:false}, {isMarried:true}, {isMarried:false}, {isMarried:"Chris"}]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e70efc515dc524f70227681")
}
2. 문서 조회하기
find() 메서드를 사용하여 컬렉션의 모든 문서를 확인합니다.
> db.demo410.find();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e70efc515dc524f70227681"), "details" : [ { "isMarried" : false }, { "isMarried" : true }, { "isMarried" : false }, { "isMarried" : "Chris" } ] }3. 조건에 맞지 않는 요소 삭제 쿼리 실행
이제 isMarried 값이 true가 아닌 모든 요소를 배열에서 제거하는 쿼리를 실행해 보겠습니다. updateMany()와 함께 $elemMatch로 조건을 확인한 뒤, $pull과 $ne를 조합하여 해당 요소들을 삭제합니다.
> db.demo410.updateMany(
... { "details": { "$elemMatch": { "isMarried": { "$ne": true } } } },
... { "$pull": { "details": { "isMarried": { "$ne": true } } } }
... )
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
실행 결과 matchedCount와 modifiedCount가 각각 1로 반환되며, 하나의 문서가 성공적으로 수정되었음을 알 수 있습니다.
4. 삭제 후 결과 확인
다시 find() 메서드로 컬렉션의 문서를 조회하여 변경 사항을 확인합니다.
> db.demo410.find();
조건(isMarried: true)과 일치하지 않던 요소들이 모두 제거되고, 다음과 같이 true인 요소만 남은 것을 확인할 수 있습니다.
{ "_id" : ObjectId("5e70efc515dc524f70227681"), "details" : [ { "isMarried" : true } ] }핵심 정리
- $pull: 지정한 조건과 일치하는 배열 요소를 제거하는 업데이트 연산자입니다.
- $ne: 필드 값이 특정 값과 같지 않음을 의미하는 비교 연산자입니다.
- $elemMatch: 배열 내 요소가 주어진 조건을 충족하는지 확인하는 데 사용됩니다.
이처럼 $pull과 $ne를 조합하면 MongoDB 배열에서 특정 조건과 일치하지 않는 요소들을 간단하게 제거할 수 있습니다.