MongoDB에서 배열 내 객체의 일부로 쿼리하는 방법
배열 안에 포함된 객체의 특정 필드 값을 기준으로 문서를 조회하려면 findOne() 메서드와 $all 연산자를 함께 사용하면 됩니다. 아래 예제를 통해 전체 과정을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성하기
먼저 insertOne() 메서드를 사용하여 Details라는 배열 필드를 가진 문서 두 개를 컬렉션에 삽입합니다.
> db.demo25.insertOne(
... {
... "Details":[
... {
... "UserId":"Carol101",
... "UserName":"Carol"
... },
... {
... "UserId":"David102",
... "UserName":"David"
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e14c86e22d07d3b95082e77")
}
> db.demo25.insertOne(
... {
... "Details":[
... {
... "UserId":"Chris101",
... "UserName":"Chris"
... },
... {
... "UserId":"Mike102",
... "UserName":"Mike"
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e14c86f22d07d3b95082e78")
}
위 명령은 Carol·David의 정보를 담은 문서와 Chris·Mike의 정보를 담은 문서, 총 두 개의 문서를 demo25 컬렉션에 추가합니다.
2. 저장된 문서 확인하기
find() 메서드를 사용하면 컬렉션에 있는 모든 문서를 한눈에 확인할 수 있습니다.
> db.demo25.find();
이 명령은 다음과 같은 출력을 반환합니다.
{ "_id" : ObjectId("5e14c86e22d07d3b95082e77"), "Details" : [ { "UserId" : "Carol101", "UserName" : "Carol" }, { "UserId" : "David102", "UserName" : "David" } ] }
{ "_id" : ObjectId("5e14c86f22d07d3b95082e78"), "Details" : [ { "UserId" : "Chris101", "UserName" : "Chris" }, { "UserId" : "Mike102", "UserName" : "Mike" } ] }3. 배열 객체의 일부 필드로 쿼리 실행하기
이제 배열 내 객체의 일부 필드인 UserId를 조건으로 쿼리하는 방법을 살펴보겠습니다. $all 연산자를 사용하면 지정한 모든 값이 배열 안에 존재하는 문서만 정확히 조회할 수 있습니다.
> db.demo25.findOne({ "Details.UserId":{$all : ["Carol101","David102"]}});위 쿼리는 다음과 같은 결과를 출력합니다.
{
"_id" : ObjectId("5e14c86e22d07d3b95082e77"),
"Details" : [
{
"UserId" : "Carol101",
"UserName" : "Carol"
},
{
"UserId" : "David102",
"UserName" : "David"
}
]
}정리
"Details.UserId"처럼 점 표기법으로 배열 내 객체의 필드 경로를 지정하고, $all 연산자로 여러 값을 동시에 조건으로 걸면 해당 값을 모두 포함하는 문서만 깔끔하게 추출할 수 있습니다. 또한 findOne()은 조건에 일치하는 첫 번째 문서 하나만 반환한다는 점도 함께 기억해 두면 좋습니다.