MongoDB in Action 2 / 3

김하영·2022년 1월 12일
0
post-custom-banner

2. 최신 웹을 위한 도큐먼트 데이터베이스

2.1 MongoDB 셸 경험하기

MongoDB의 자바 스크립트 셸은 데이터를 다루기가 쉽고, 도큐먼트와 컬렉션 그리고 데이터 베이스의 특정 쿼리 언어에 대한 구체적인 의미를 이해하기 쉽게 해준다.

2.1.2 데이터베이스, 컬렉션, 도큐먼트

데이터베이스(Database)

  • 데이터베이스는 컬렉션의 물리적 컨테이너. 하나의 데이터베이스에는 보통 여러개의 컬렉션을 가지고 있다.

컬렉션(Collection)

  • 컬렉션은 몽고DB Document의 그룹이며 RDBMS 의 예를 들면 Table 과 개념과 유사하다.

  • 컬렉션은 단일 데이터베이스에 존재한다.

  • 컬렉션은 스키마를 강요하지 않고 컬렉션 내부의 도큐먼트는 서로 다른 필드를 가질 수 있다.

  • 컬렉션 안에 도큐먼트는 일반적으로 서로 유사한 하거나 관련된 목적이 있다.

Document

  • Document 는 하나의 키(key) 와 값(value)의 집합으로 이루어져 있으며 동적 스키마.

  • 동적 스키마는 동일한 컬랙션 내의 도큐먼트가 동일한 필드 또는 구조를 가지필요 없을을 의미한다.

  • 그리고 동일한 필드안에 다른타입의 데이타를 보유할수 있음을 의미한다.

데이터베이스와 컬렉션의 생성

MongoBD에서는 데이터베이스를 만드는 것이 필요 없다. 데이터베이스와 컬렉션은 도큐먼트가 처음 입력될 때 생성된다.
즉, 도큐먼트의 구조가 미리 정의될 필요가 없듯이 개별 컬렉션과 데이터베이스도 런타임 시에 생성된다.
이렇게 함으로써 개발 과정이 단순해지고 빨라지며, 본질적으로 동적 네임스페이스 할당을 충분히 활용하게 된다.

데이터베이스나 컬렉션이 우연히 생성될까 우려된다면 드라이버에서 지원되는 strict 모드를 통해 그러한 실수를 미연에 방지할 수 있다.

2.1.3 삽입과 질의

삽입

> db.users.insert({username: "smith"})
WriteResult({"nInserted" : 1 })

질의

> db.users.find()
{"_id" : ObjectId("53434dedasdse34242343234d", "username" " "smitch"}
  • MongoDB의 _ID 필드

_id 필드를 정의하지 않아도 자동으로 추가된 것을 주목하기 바란다.
_id는 도큐먼트의 프라이머리 키라고 생각하면 된다. 모든 MongoDB 도큐먼트는 _id 필드가 필요한데,
도큐먼트가 생성될 때 이 필드가 없으면 MongoDB 객체 ID 라는 특별한 값을 생성하여 도큐먼트에 자동으로 추가한다.

count

> db.users.count()
2
  • 질의 술어 넘겨주기

컬렉션 하나 이상의 도큐먼트가 있으므로 약간 더 정교한 쿼리를 실행해 볼 수 있다.
find 메서드에 간단한 쿼리 셀렉터( query selector)를 넘겨줄 수 있다.

쿼리 셀렉터 : 컬렉션에 있는 모든 도큐먼트에 대해 일치 여부를 검사하기 위한 조건으로 사용되는 도큐먼트

> db.users.find({username : "jones"})

$and / $or 연산자를 활용하여 질의를 하기도 한다.

2.1.4 도큐먼트 업데이트

모든 업데이트 쿼리는 최소 두 개의 매개변수가 필요하다.

  • 첫 번째 매개변수 : 업데이트할 도큐먼트에 대한 것
  • 두 번째 매개변수 : 수정할 내용

update() 메서드는 단일 도큐먼트를 업데이트함을 기억해두자.

  • 연산자 업데이트

$set 연산자를 사용하여 업데이트를 한다.

> db.users.update({username:"smith"},{$set: {country: "Canada"}
  • 대체 업데이트

$set 연산자를 사용하지 않으면 아예 도큐먼트를 다른 것으로 업데이트 하는 것이다.

> db.users.update({username: "smith"}, {country: "Canada"})

실행 후, find() 명령 실행 시 아래와 같이 출력

{"_id" : ObjectId("231312swdsweq"), "country": "Canada" }

_id는 같지만, 데이터는 업데이트 문에서 대체되었다.

만약 특정 항목을 제거하고 싶다면 $unset 연산자를 사용하면 된다.
find() 시, find().pretty() 호출을 한다면 가독성 있는 형태로 결과를 출력한다.

  • 더 발전된 업데이트

기존 리스트에 값을 추가한다면 $push / $addToset을 사용하는 걸 추천한다.

2.1.5 데이터 삭제

도큐먼트 삭제 시에는 remove() 메서드를 사용하며, 쿼리 셀렉터를 넘기면 조건에 맞는 도큐먼트를 삭제한다.

컬렉션 삭제 시에는 drop() 메서드를 사용한다.

2.2 인덱스 생성과 질의

인덱스 생성 후, explain() 명령어를 사용하여 인덱스에 대한 쿼리를 프로파일하면 인덱싱의 효율을 볼 수 있다.

인덱스는 어느 정도의 공간이 필요하고 미세하게 insert 성능을 떨어뜨리지만, 쿼리 최적화를 위해 꼭 필요한 도구이다.

3. MongoDB를 이용한 프로그래밍

루비라는 스크립트 언어를 활용하여 API 설명..
딱히 내가 자세히 살펴 볼 내용은 없었다. pass..
( 주로 spring jpa 로 mongoDB 사용 )

profile
Back-end Developer
post-custom-banner

0개의 댓글