Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

_id가 하위 문서 배열에 포함된 문서를 조회하는 MongoDB 쿼리 방법

MongoDB에서 한 컬렉션의 하위 문서(subdocument) 배열에 포함된 _id 값을 기준으로 다른 컬렉션의 문서를 조회하는 방법을 알아보겠습니다. 이 작업에는 $in 연산자와 distinct() 메서드를 함께 활용합니다.

1단계: 첫 번째 컬렉션 생성

먼저 하위 문서 배열을 포함하는 컬렉션을 생성합니다.

> db.demo568.insertOne({ _id: 101, details: [ { id : 101 }, { id:103 } ] });
{ "acknowledged" : true, "insertedId" : 101 }

2단계: 첫 번째 컬렉션 문서 확인

find() 메서드를 사용하여 컬렉션의 모든 문서를 조회합니다.

> db.demo568.find();

실행 결과는 다음과 같습니다.

{ "_id" : 101, "details" : [ { "id" : 101 }, { "id" : 103 } ] }

여기서 demo568 컬렉션의 details 필드는 하위 문서들의 배열이며, 각 하위 문서는 id 값을 가지고 있습니다.

3단계: 두 번째 컬렉션 생성

이제 조회 대상이 될 두 번째 컬렉션을 생성하고 문서를 삽입합니다.

> db.demo569.insertOne({ _id: 101, details: "John" })
{ "acknowledged" : true, "insertedId" : 101 }
> db.demo569.insertOne({ _id: 102, details: "Chris" })
{ "acknowledged" : true, "insertedId" : 102 }
> db.demo569.insertOne({ _id: 103, details: "David" })
{ "acknowledged" : true, "insertedId" : 103 }

4단계: 두 번째 컬렉션 문서 확인

find() 메서드로 모든 문서를 조회해 보겠습니다.

> db.demo569.find();

실행 결과는 다음과 같습니다.

{ "_id" : 101, "details" : "John" }
{ "_id" : 102, "details" : "Chris" }
{ "_id" : 103, "details" : "David" }

핵심 쿼리: 하위 문서 배열의 _id로 문서 매칭하기

다음은 demo568 컬렉션의 하위 문서 배열에 포함된 id 값들과 일치하는 _id를 가진 demo569 컬렉션의 문서를 조회하는 쿼리입니다.

> db.demo569.find({ '_id': { '$in': db.demo568.distinct('details.id', {'_id': 101}) }})

쿼리의 동작 원리를 살펴보면 다음과 같습니다.

db.demo568.distinct('details.id', {'_id': 101}) 부분은 demo568 컬렉션에서 _id가 101인 문서의 details.id 필드 값들을 중복 없이 추출하여 [101, 103] 배열을 반환합니다. 그런 다음 $in 연산자가 이 배열을 받아 demo569 컬렉션에서 _id가 101 또는 103인 문서만 필터링합니다.

실행 결과

위 쿼리를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.

{ "_id" : 101, "details" : "John" }
{ "_id" : 103, "details" : "David" }

결과를 보면 _id가 102인 "Chris" 문서는 하위 문서 배열에 포함되어 있지 않기 때문에 조회 결과에서 제외된 것을 확인할 수 있습니다. 이처럼 distinct()$in 연산자를 조합하면 하위 문서 배열의 값을 기준으로 다른 컬렉션의 문서를 손쉽게 매칭할 수 있습니다.