MongoDB에서 배열에 저장된 여러 객체 중 조건에 맞는 특정 객체 하나만 추출하고 싶을 때가 있습니다. 이럴 때 유용하게 사용할 수 있는 것이 바로 위치 연산자($)입니다. 위치 연산자를 사용하면 쿼리 조건과 일치하는 배열 요소만 선택적으로 반환받을 수 있습니다.
1. 테스트용 컬렉션 생성하기
먼저 예제로 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다. 고객 정보와 함께 구매 내역이 배열 형태로 저장된 구조입니다.
> db.getASpecificObjectDemo.insertOne(
... {
... _id : 1,
... "CustomerName" : "Larry",
... "CustomerDetails" : {
... "CustomerPurchaseDescription": [{
... id : 100,
... "ProductName" : "Product-1",
... "Amount": 10000
... },{
... id : 101,
... "ProductName" : "Product-2",
... "Amount": 10500
... },
... {
... id : 102,
... "ProductName" : "Product-3",
... "Amount": 10200
... }
... ]
... }
... );
{ "acknowledged" : true, "insertedId" : 1 }2. 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.getASpecificObjectDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : 1,
"CustomerName" : "Larry",
"CustomerDetails" : {
"CustomerPurchaseDescription" : [
{
"id" : 100,
"ProductName" : "Product-1",
"Amount" : 10000
},
{
"id" : 101,
"ProductName" : "Product-2",
"Amount" : 10500
},
{
"id" : 102,
"ProductName" : "Product-3",
"Amount" : 10200
}
]
}
}3. 위치 연산자($)로 특정 객체만 가져오기
이제 핵심 부분입니다. _id가 1인 문서 안에서, 구매 내역 배열 중 id가 101인 객체만 골라서 조회하려면 아래와 같이 쿼리를 작성합니다.
> db.getASpecificObjectDemo.find({_id:1, "CustomerDetails.CustomerPurchaseDescription.id":101},{_id:0, "CustomerDetails.CustomerPurchaseDescription.$":1});쿼리 구조를 살펴보면 다음과 같습니다.
- 첫 번째 인수(조건): _id:1로 대상 문서를 지정하고, 점 표기법으로 배열 내부 필드인 CustomerDetails.CustomerPurchaseDescription.id가 101인 요소를 찾습니다.
- 두 번째 인수(프로젝션): _id:0으로 _id 필드는 제외하고, 위치 연산자 $를 사용해 조건과 일치하는 배열 요소만 포함시킵니다.
실행 결과, 원하는 객체 하나만 정확히 반환되는 것을 확인할 수 있습니다.
{ "CustomerDetails" : { "CustomerPurchaseDescription" : [ { "id" : 101, "ProductName" : "Product-2", "Amount" : 10500 } ] } }마무리
이처럼 MongoDB의 위치 연산자($)를 활용하면 배열 전체가 아닌, 쿼리 조건에 일치하는 특정 객체만 깔끔하게 조회할 수 있습니다. 배열 데이터가 많은 실무 환경에서 불필요한 데이터 전송을 줄이고 성능을 최적화하는 데 큰 도움이 되니 꼭 기억해 두세요.