MongoDB에서 ObjectId로 이루어진 배열에서 특정 값을 제거하고 싶다면 $pull 연산자를 사용하면 됩니다. $pull은 배열 내에서 지정한 조건과 일치하는 모든 요소를 손쉽게 삭제해 주는 강력한 업데이트 연산자입니다.
이 글에서는 실제 예제를 통해 ObjectId 배열에서 값을 제거하는 전체 과정을 단계별로 살펴보겠습니다.
1. 테스트 컬렉션 생성하기
먼저 ObjectId 배열을 포함하는 문서를 컬렉션에 삽입합니다.
> db.demo258.insertOne({"arrayOfObjectsId":[ ObjectId("5e47a5e81627c0c63e7dba92"),ObjectId("5e47a5e51627c0c63e7dba91")]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e47a8211627c0c63e7dba97")
}insertOne() 메서드가 성공적으로 실행되면 위와 같이 acknowledged가 true로 반환되며, 새로 생성된 문서의 _id를 확인할 수 있습니다.
2. 저장된 문서 확인하기
find() 메서드를 사용하여 컬렉션의 모든 문서를 조회합니다.
> db.demo258.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e47a8211627c0c63e7dba97"), "arrayOfObjectsId" : [ ObjectId("5e47a5e81627c0c63e7dba92"), ObjectId("5e47a5e51627c0c63e7dba91") ] }현재 배열에는 두 개의 ObjectId가 들어있는 것을 확인할 수 있습니다.
3. $pull 연산자로 배열에서 값 제거하기
이제 $pull 연산자와 $in 조건을 함께 사용하여 배열에서 특정 ObjectId를 제거해 보겠습니다.
> db.demo258.update( { }, { $pull: { arrayOfObjectsId: { $in: [ ObjectId("5e47a5e81627c0c63e7dba92") ] } } } );
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })쿼리 구조를 간단히 설명하면 다음과 같습니다.
- 첫 번째 인수 { }: 업데이트 조건으로, 비워두면 컬렉션의 모든 문서에 적용됩니다.
- $pull: arrayOfObjectsId 필드에서 조건에 맞는 요소를 제거합니다.
- $in: 여러 개의 ObjectId를 한 번에 지정하여 일괄 삭제할 수도 있습니다.
WriteResult의 nModified가 1로 반환된 것을 보면, 문서 하나가 성공적으로 수정되었음을 알 수 있습니다.
4. 결과 확인하기
다시 find() 메서드로 문서를 조회하여 변경 사항을 확인합니다.
> db.demo258.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e47a8211627c0c63e7dba97"), "arrayOfObjectsId" : [ ObjectId("5e47a5e51627c0c63e7dba91") ] }배열에서 ObjectId("5e47a5e81627c0c63e7dba92")가 정상적으로 제거되고, 나머지 하나만 남아 있는 것을 확인할 수 있습니다.
마무리
MongoDB에서 ObjectId 배열의 특정 값을 제거하는 방법은 생각보다 간단합니다. 핵심은 $pull 연산자를 사용하고, 필요에 따라 $in 조건과 결합하여 여러 값을 한 번에 처리하는 것입니다. 이 패턴은 참조 도큐먼트 ID 목록을 관리하거나 사용자 즐겨찾기 목록을 정리할 때 등 실무에서 매우 자주 활용되므로 꼭 기억해 두시기 바랍니다.