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

MongoDB에서 JSON 배열의 내부 요소에 접근하는 방법

MongoDB에서 JSON 배열의 내부 요소에 접근하기

MongoDB에서 JSON 배열 안에 중첩된 내부 요소에 접근하려면 점 표기법(dot notation)을 사용하면 됩니다. 점 표기법은 필드 이름을 마침표(.)로 연결하여 문서 내부의 하위 필드나 배열 요소까지 경로를 지정하는 방식입니다.

먼저 예제에 사용할 문서들을 담은 컬렉션을 생성해 보겠습니다.

1. 샘플 데이터 생성

> db.demo687.insert({CountryName:'US',
... info:
... {
... id:101,
... details:
... [
... {
   Name:'Chris',
   SubjectName:'MongoDB',
   otherDetails:{
      "Marks":58,
      Age:23
   }
... }
... ]
... }
... }
... )
WriteResult({ "nInserted" : 1 })
> db.demo687.insert({CountryName:'UK',
... info:
... {
... id:102,
... details:
... [
... {
   Name:'David',
   SubjectName:'MySQL',
   otherDetails:{
      "Marks":78,
      Age:21
   }
... }
... ]
... }
... }
... )
WriteResult({ "nInserted" : 1 })

위 예제에서는 국가 이름(CountryName)과 함께 info 객체 안에 id, 그리고 details 배열이 중첩된 구조의 문서 두 개를 삽입했습니다. 각 details 배열 요소는 학생 이름(Name), 과목명(SubjectName), 그리고 Marks와 Age를 포함하는 otherDetails 객체로 구성되어 있습니다.

2. 저장된 문서 확인하기

find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.

> db.demo687.find();

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

{ "_id" : ObjectId("5ea55658a7e81adc6a0b3962"), "CountryName" : "US", "info" : { "id" : 101, "details" : [ { "Name" : "Chris", "SubjectName" : "MongoDB", "otherDetails" : { "Marks" : 58, "Age" : 23 } } ] } }
{ "_id" : ObjectId("5ea55673a7e81adc6a0b3963"), "CountryName" : "UK", "info" : { "id" : 102, "details" : [ { "Name" : "David", "SubjectName" : "MySQL", "otherDetails" : { "Marks" : 78, "Age" : 21 } } ] } }

3. 점 표기법으로 배열 내부 요소 조회하기

JSON 배열의 내부 요소에 접근하는 핵심 쿼리는 다음과 같습니다. 경로를 마침표로 이어 붙여 info.details.otherDetails.Marks에 도달한 뒤, 원하는 값과 일치하는 문서만 필터링합니다.

> db.demo687.find({"info.details.otherDetails.Marks":58});

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

{ "_id" : ObjectId("5ea55658a7e81adc6a0b3962"), "CountryName" : "US", "info" : { "id" : 101, "details" : [ { "Name" : "Chris", "SubjectName" : "MongoDB", "otherDetails" : { "Marks" : 58, "Age" : 23 } } ] } }

Marks 값이 58인 US 문서만 정확히 반환된 것을 확인할 수 있습니다.

참고: 배열의 특정 위치(인덱스)에 접근하기

배열 전체가 아닌 특정 인덱스의 요소만 대상으로 조회하고 싶다면, 경로에 숫자 인덱스를 추가하면 됩니다. 예를 들어 details 배열의 첫 번째 요소만 검사하려면 다음과 같이 작성합니다.

> db.demo687.find({"info.details.0.otherDetails.Marks":58});

인덱스를 생략하면 MongoDB는 배열의 모든 요소를 순회하며 조건에 맞는 문서를 찾고, 인덱스를 지정하면 해당 위치의 요소만 비교한다는 차이가 있습니다. 상황에 따라 적절한 방식을 선택해 사용하시기 바랍니다.