중첩된 배열 문서에서 특정 필드만 가져오려면 $project와 함께 $filter를 사용합니다. 문서로 컬렉션을 만들자 −
> db.demo342.insertOne({ ... "Id": "101", ... "details1" : { ... "details2" : [ ... { ... "details3" : [ ... { ... "Name": "Mike", ... "CountryName" : "US" ... }, ... { ... "Name": "David", ... "CountryName" : "AUS" ... }, ... { ... "Name": "Bob", ... "CountryName" : "UK" ... } ... ] ... } ... ] ... } ... } ... ); { "acknowledged" : true, "insertedId" : ObjectId("5e53ef99f8647eb59e5620a9") }
find() 메서드를 사용하여 컬렉션의 모든 문서 표시 -
> db.demo342.find();
이것은 다음과 같은 출력을 생성합니다 -
{ "_id" : ObjectId("5e53ef99f8647eb59e5620a9"), "Id" : "101", "details1" : { "details2" : [ { "details3" : [ { "Name" : "Mike", "CountryName" : "US" }, { "Name" : "David", "CountryName" : "AUS" }, { "Name" : "Bob", "CountryName" : "UK" } ] } ] } }
다음은 중첩 배열 문서에서 특정 필드만 가져오는 쿼리입니다. -
> db.demo342.aggregate([ ... { "$project": { ... "details1": { ... "details2": { ... "$filter": { ... "input": { ... "$map": { ... "input": "$details1.details2", ... "in": { ... "details3": { ... "$filter": { ... "input": "$$this.details3", ... "cond": { "$eq": ["$$this.Name", "Bob"] } ... } ... } ... } ... } ... }, ... "cond": { "$ne": ["$$this.details3", []] } ... } ... } ... } ... }} ... ])
이것은 다음과 같은 출력을 생성합니다 -
{ "_id" : ObjectId("5e53ef99f8647eb59e5620a9"), "details1" : { "details2" : [ { "details3" : [ { "Name" : "Bob", "CountryName" : "UK" } ] } ] } }