[MongoDB] 데이터 필터링, Nested Document - (3)
⚒️ 데이터 분류, 필터링 하는법
저번 포스팅에서 다루었던 db.books.find()는 books라는 컬렉션에 있는 모든 데이터들을 반환한다. 여기서는 .find()라는 하나의 메서드가 쓰였지만, .find() 뒤에 다른 메서드들을 추가하면 여러가지 메서드를 동시에 쓸 수 있다. 이를 "메서드 체이닝(Method Chaining)" 이라고 부른다.
예를들어, db.books.find().count() 메서드는 [find() + count()]를 합친 메서드 체이닝 방식이며, 여기서는 books 컬렉션에 있는 모든 document의 갯수를 반환하는 역할을 한다.
또한, 이런식으로 필터링과 함께 사용 할 수도 있다.
이제, 메서드 체이닝이 대략 무엇인지 알았으니 데이터를 특정 기준에 따라 정렬하는법을 배워보자.
MongoDB에서의 정렬은 .sort() 메서드를 이용하는데, 아래 예시를 한번 보자.
db.books.find().sort({rating : 1})
위의 소스 코드는 books 컬렉션에서 모든 document들을 가져와 rating을 기준으로 데이터들을 정렬한다. 여기서 rating : 1이라고 되어 있는데, 이 말은 rating을 오름차순으로 정렬 한다는 이야기이고, rating: -1을 하면 내림차순으로 정렬 한다는 이야기이다. 알파벳 또한 마찬가지이다. 예를 들어, title은 문자열이고, 이 title에 : 1을 하면 알파벳순으로 정렬을 하고, title에 : -1을 하면 알파벳을 뒤집은 순서대로 정렬을 한다는 뜻이다.
⚒️ Nested Document
예전 포스팅에서 잠깐 보고 넘어간적이 있지만, 이번에는 조금 더 자세히 살펴보고 가보자. 먼저, 이 Nested Document를 보기 전에 다시한번 document에 대해 알고 넘어가자. MongoDB(NoSQL)에서의 데이터 타입은 JSON이다. JSON객체는 : 를 구분자로 키-값 쌍으로 이루어져 있다.
위를 보면 title, genres와 같은 것들은 key값이고, : 뒤에 오는 값들은 value 값들이다. 여기서 value안에 또 다른 document(즉, JSON object)가 들어갈 수 있다. 이를 nested document라고 부른다.
위를 보면, reviews라는 키값의 value들은 [] 배열안에 {}, 로 구분지어져 있다. 여기서 {}은 각 document를 나타내는데, 즉 reviews라는 키값 안에는 배열에 하나씩 또 다른 document를 담아놓은 것이다.
이 Nested Document를 이용하면 이점이 있다. 첫번째 이점은, 만약 우리가 Nested Document를 사용하고 싶지 않다면, reviews라는 컬렉션을 따로 만들어 두개의 컬렉션을 관리해야 한다. 하지만 이렇게 Nested Document를 사용하면, 하나의 컬렉션만 관리해주면 된다. 이는 복잡성을 줄일 수 있다. 그렇다면, books컬렉션에 있는 reviews에 접근 하고싶다면 어떻게 하면 될까? 우리는 2개의 쿼리를 엮어야 한다.
이제, 이 reviews라는 Nested Document에 또 다른 데이터들을 추가 해 보도록 하자.
db.books.insertOne({title : "The Way of Kings", author : "Jay", rating : 9, pages : 450, genre : ["fantasy"],
reviews : [{name : "Yoshi", body : "Good"}, {name : "Mario", body : "Meh"}]})
위의 소스 코드는 books 컬렉션에 단 한가지의 데이터만 삽입한다. 하지만 여기 삽입하려는 데이터들을 잘 살펴보자. reviews이전 까지는 우리가 항상 해왔던 방식으로 데이터를 넣어 주었다. 하지만 reviews를 보면, []라는 배열안에 Yoshi, Mario가 쓴 리뷰들을 {}를 이용해 각각의 리뷰를 document화 하여 넣어 주었다.
이렇게 하고 컴파스를 확인해보면
아래와 같이 성공적으로 데이터가 잘 들어간 것을 확인 할 수 있다.