MongoDB에서 배열 내부의 특정 값을 검색하려면 점(.) 표기법(dot notation)을 사용합니다. 점 표기법은 배열 안에 포함된 하위 문서의 필드에 직접 접근할 수 있게 해주며, find() 쿼리와 함께 사용하면 원하는 조건에 맞는 문서만 정확하게 추출할 수 있습니다.
1. 샘플 컬렉션 생성
먼저 실습에 사용할 컬렉션을 만들고 문서 두 개를 삽입해 보겠습니다.
> db.retrievingArrayDemo.insertOne(
{ "UserDetails" : [
{ "UserName" : "John", "UserAge" : 23 } ],
"UserCountryName" : "AUS",
"UserLoginDate" : new ISODate(),
"UserMessage" : "Hello"
}
);
{
"acknowledged" : true,
"insertedId" : ObjectId("5ce9718478f00858fb12e920")
}
> db.retrievingArrayDemo.insertOne(
{ "UserDetails" : [
{ "UserName" : "Sam", "UserAge" : 24 } ],
"UserCountryName" : "UK",
"UserLoginDate" : new ISODate(),
"UserMessage" : "Bye"
}
);
{
"acknowledged" : true,
"insertedId" : ObjectId("5ce9718478f00858fb12e921")
}2. 전체 문서 조회하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 한눈에 확인할 수 있습니다.
> db.retrievingArrayDemo.find().pretty();
실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.
{
"_id" : ObjectId("5ce9718478f00858fb12e920"),
"UserDetails" : [
{
"UserName" : "John",
"UserAge" : 23
}
],
"UserCountryName" : "AUS",
"UserLoginDate" : ISODate("2019-05-25T16:47:00.211Z"),
"UserMessage" : "Hello"
}
{
"_id" : ObjectId("5ce9718478f00858fb12e921"),
"UserDetails" : [
{
"UserName" : "Sam",
"UserAge" : 24
}
],
"UserCountryName" : "UK",
"UserLoginDate" : ISODate("2019-05-25T16:47:00.670Z"),
"UserMessage" : "Bye"
}3. 점 표기법으로 배열 값 검색하기
이제 find 쿼리에 점 표기법을 적용해 배열 내부의 값을 검색해 보겠습니다. 아래 쿼리는 국가명(UserCountryName)이 "UK"이면서, UserDetails 배열 안의 UserName이 "Sam"인 문서를 찾는 예제입니다.
> db.retrievingArrayDemo.find({"UserCountryName" : "UK", "UserDetails.UserName":"Sam"}).pretty();쿼리 실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5ce9718478f00858fb12e921"),
"UserDetails" : [
{
"UserName" : "Sam",
"UserAge" : 24
}
],
"UserCountryName" : "UK",
"UserLoginDate" : ISODate("2019-05-25T16:47:00.670Z"),
"UserMessage" : "Bye"
}핵심 포인트 정리
- "배열이름.하위필드" 형태로 작성하면 MongoDB가 배열의 각 요소를 자동으로 순회하며 조건을 비교합니다.
- 여러 조건을 콤마(,)로 나열하면 AND 조건으로 처리되어 더욱 정밀한 검색이 가능합니다.
- 쿼리 마지막에 pretty() 메서드를 붙이면 결과가 보기 좋게 정렬되어 출력됩니다.