MongoDB에서 배열 요소를 조건에 따라 제거하고 싶다면 $pull 연산자와 update 메서드를 함께 사용하면 됩니다. 이 글에서는 특정 값보다 작은 요소를 여러 문서에서 한 번에 제거하는 방법을 예제와 함께 살펴보겠습니다.
1. 샘플 컬렉션 생성하기
먼저 데모용 컬렉션을 만들고 문서를 삽입해 보겠습니다.
> db.demo198.insertOne({"List":{"Values":[10,20,30,30,70,80,90]}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3c224503d395bdc21346df")
}
> db.demo198.insertOne({"List":{"Values":[56,978,56,34,23,34]}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3c225403d395bdc21346e0")
}
> db.demo198.insertOne({"List":{"Values":[21,12,14,15,34,56]}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3c226603d395bdc21346e1")
}2. 저장된 문서 확인하기
find() 메서드를 사용하면 컬렉션의 모든 문서를 조회할 수 있습니다.
> db.demo198.find();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e3c224503d395bdc21346df"), "List" : { "Values" : [ 10, 20, 30, 30, 70, 80, 90 ] } }
{ "_id" : ObjectId("5e3c225403d395bdc21346e0"), "List" : { "Values" : [ 56, 978, 56, 34, 23, 34 ] } }
{ "_id" : ObjectId("5e3c226603d395bdc21346e1"), "List" : { "Values" : [ 21, 12, 14, 15, 34, 56 ] } }3. $pull로 조건에 맞는 배열 요소 제거하기
이제 여러 조건을 적용하여 $pull 연산자로 배열 요소를 제거하는 쿼리를 실행해 보겠습니다. 아래 예제에서는 $lt(미만) 조건을 사용해 값이 40보다 작은 모든 요소를 제거합니다. 또한 세 번째 인자로 { "multi": true } 옵션을 지정하여 컬렉션 내 모든 문서에 업데이트를 적용했습니다.
> db.demo198.update({}, { "$pull": { "List.Values": { "$lt": 40 } } }, { "multi": true });
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })실행 결과를 보면 3개의 문서가 매칭되고, 3개의 문서가 성공적으로 수정되었음을 확인할 수 있습니다.
4. 업데이트 결과 확인하기
다시 find() 메서드로 전체 문서를 조회해 보겠습니다.
> db.demo198.find();
업데이트 후 출력되는 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e3c224503d395bdc21346df"), "List" : { "Values" : [ 70, 80, 90 ] } }
{ "_id" : ObjectId("5e3c225403d395bdc21346e0"), "List" : { "Values" : [ 56, 978, 56 ] } }
{ "_id" : ObjectId("5e3c226603d395bdc21346e1"), "List" : { "Values" : [ 56 ] } }정리
위 결과를 보면 각 문서의 Values 배열에서 40 미만의 값들이 모두 제거된 것을 확인할 수 있습니다. 핵심 포인트를 정리하면 다음과 같습니다.
- $pull: 조건에 일치하는 배열 요소를 제거하는 연산자입니다.
- $lt: 비교 조건 연산자로, 지정한 값보다 작은 요소를 대상으로 합니다.
- multi: true: 기본적으로 update()는 첫 번째 매칭 문서만 수정하지만, 이 옵션을 사용하면 조건에 맞는 모든 문서를 한 번에 업데이트할 수 있습니다.
이처럼 $pull 연산자와 비교 연산자, multi 옵션을 조합하면 복잡한 조건의 배열 데이터 정리 작업도 손쉽게 처리할 수 있습니다.