바닥코딩

MongoDB 배열 본문

데이터 베이스/MongoDB

MongoDB 배열

개발공부개발공부 2023. 8. 14. 17:27

mongoDB는 RDB와 달리 가변적인 값을 가질 수 있습니다. 예를 들어 RDB에서 특정 테이블에 3가지 컬럼 A,B,C가 있을 경우 

SELECT *
FROM TEST

 

이와 같은 SQL 쿼리의 모든 결과 레코드는 같은 개수의 컬럼을 가지고 있습니다. 값이 NULL일 경우에도 말이죠.  그렇지만 MongoDB의 경우 각 document 마다 다른 개수의 필드를 가질 수 있으며, 필드의 값을 배열로 가질 수 있습니다. 이번 포스트에서는 이런 가변길이의 특성과 배열 연산자를 알아보겠습니다.

 

배열 Insert

 mongoDB는 BSON 구조로 이루어진 데이터베이스 입니다. 따라서 필드의 값이 BSON 구조일 경우 document의 값으로 입력이 가능합니다.  

 예를 들어 특정 반에 소속된 학생들의 정보를 저장하는 collection이 존재하고 그 안에 학생들의 정보를 삽입한다고 가정해 봅시다.

{
    "school" : "mongoschool",
    "classs" : "1",
    "students" : [
        {
            "name" : "kim",
            "grade" : "1"
        },
        {
            "name" : "Lee",
            "grade" : "1"
        },
        {
            "name" : "Park",
            "grade" : "1"
        }
    ]
    
}

위와 같은이 한 반에 3명의 학생의 정보를 담는  students 필드의 값을 배열로 지정한 다음

db.class.insertOne({
    "school" : "mongoschool",
    "classs" : "1",
    "students" : [
        {
            "name" : "kim",
            "grade" : "1"
        },
        {
            "name" : "Lee",
            "grade" : "1"
        },
        {
            "name" : "Park",
            "grade" : "1"
        }
    ]
    
})

위와 같은 명령어를 통해 class collection에 값을 삽입해 줍니다. 

compass를 통해 삽입 결과를 확인 하면 위와 같이 document에  배열 값을 field에 삽입할 수 있는 것을 확인하실 수 있습니다.

 

배열 연산자 

mongoDB에서는 배열을 특정 필드의 값으로 가질 수 있는 만큼  배열을 다루기 위한 연산자를 제공합니다.  해당 포스트 에서서는 배열을 다루기 위한 연산자를 알아보겠습니다.

연산자를 학습하기 위해 특정 값들을 삽입하겠습니다 

db.nation.insertMany(
[
    {
        "continent": "Asia",
        "contry": ["Korea","China", "Japan"]
    },
    {
        "continent": "Europe",
        "contry": [ "France","Germany", "Italy"]
    },
    {
        "continent": "Africa",
        "contry": [ "Nigeria","Egypt", "South Africa" ]
    },
    {
        "continent": "South America",
        "contry": [ "Brazil","EgypArgentinat", "Colombia" ]
    },
    {
        "continent": "North America",
        "contry": [ "United States","Canada", "Mexico" ]
    }
]
)

해당 명령어를 실행 했을 경우 각 대륙별 나라 정보가 document로 삽입 되어 질 것입니다.  여기서 먼저 mongoDB에서 배열이 가진 특성을 하나 알아야 하는데, mongoDB에서는 배열 fild의 값중 하나라도 포함이 되어 진다면 그 document를 find하는 것이 가능합니다 예를 들어

db.nation.find({contry : "Korea"})

이러한 명령어를 입력하였을 경우 Asis Document는 ["Korea","China", "Japan"] 라는 배열 값을 필드 값으로 가지고 있지만 그 요소안 Korea 만 find Query에 포함 되어도 결과로 반환 합니다.

$all

 위와 같은 특성이 물론 편할 수도 있지만, 특정 배열의 모든 값을 포함하는 Document 만을 찾고 싶은 경우에는 적합하지 않을 수 있습니다. 이럴경우 $all  연산자를 통해 배열 속 모든 값을 포함하는 Documnet만을 조회하는 것이 가능합니다

//"Korea","China", "Japan" 모두 포함된 document만을 조회
db.nation.find({contry : {$all : ["Korea","China", "Japan"]}})

//"Korea","China", "India" India는 요소로 존재하지 않기 때문에 조회 되지 않음
db.nation.find({contry : {$all : ["Korea","China", "India"]}})

 

$elemMatch

 elemMatch의 경우 모든 뭐리를 만족하는 값을 가지는 Document를 반환 합니다.

'데이터 베이스 > MongoDB' 카테고리의 다른 글

집합 파이프라인  (0) 2023.08.15
MongoDB 명령어(Update & Delete)  (0) 2023.08.15
논리, 비교 Query  (0) 2023.06.18
MongoDB 명령어(Read)  (0) 2023.06.18
MongoDB 명령어(Create & Insert)  (0) 2023.06.18