2장. 몽고DB 기본

두더지·2024년 4월 5일
0

[몽고DB 완벽 가이드] 책을 보고 정리한 내용입니다.

도큐먼트

: 몽고DB 데이터의 기본 단위이며 관계형 데이터베이스의 행과 유사. 정렬된 키와 연결된 값의 집합으로 이뤄져있다.

{"greeting" : "Hello, world!"}

간단한 도큐먼트로
키 : "greeting", 값 : "Hello, world!" 를 가진다.

  • 키는 null 문자를 포함하지 않고 ₩n은 키의 끝을 나타내는 데 사용된다.
  • 데이터형과 대소문자를 구별한다.
  • 키는 중복될 수 없다.

컬렉션

: 도큐먼트의 모음. 관계형 데이트베이스에서의 테이블에 대응된다.

동적 스키마

: 하나의 컬렉션 내 도큐먼트들이 모두 다른 구조를 가질 수 있다.

네이밍

: 컬렉션은 이름으로 식별된다.

  • 빈 문자열은 유효한 컬렉션명이 아니다.
  • ₩n은 컬렉션의 끝을 나타내는 문자이므로 컬렉션에 포함되지 않는다.
  • system.으로 시작하는 컬렉션명은 시스템 컬렉션에서 사용하는 예약어이다. (ex. system.users - 데이터 사용자 정보 컬렉션)
  • 사용자가 만든 컬렉션에서 $를 컬렉션명에 포함할 수 없다.

서브컬렉션

서브컬렉션의 네임스페이스에 '.'를 사용하여 컬렉션을 체계화한다.
ex. 블로그 기능이 있는 애플리케이션 : blog.posts, blog.authors 으로 표현가능
서브컬렉션의 특별한 속성은 없지만 여러 몽고DB 툴에서 지원한다

데이터베이스

: 컬렉션을 그룹지어 놓는 곳.
몽고DB의 단일 인스턴스는 여러 데이터베이스를 호스팅할 수 있으며 각 데이터베이스를 완전히 독립적으로도 취급할 수 있다.

데이터베이스 또한 이름으로 식별되는데

  • 빈 문자열은 유효한 데이터베이스 이름이 아니다.
  • / ₩ , ' < > : ? $ 등의 문자를 포함할 수 없다.
  • 대소문자를 구별하낟.
  • 최대 64바이트이다.

또한, 직접 접근할 순 있지만 특별한 의미론을 갖는 예약된 데이터베이스 이름도 있다.

  • admin : 인증과 권한 부여 역할
  • local : 단일 서버에 대한 데이터 저장
  • config : 샤딩된 몽고DB 클러스터는 이를 사용해 각 샤드의 정보 저장

** 컬렉션을 저장하는 DB의 이름을 컬렉션명 앞에 붙이면 올바른 컬렉션명인 네임스페이스를 얻는다.
ex. cms 데이터베이스의 blog.posts 컬렉션을 사용한다면 컬렉션의 네임스페이스는 cms.blog.posts가 된다.

셸 기본 작업

생성

> movie = {"title" : "Star Wars: Episode IV - A New Hope",
... "director" : "George Lucas",
... "year" : 1977}

도큐먼트를 나타내는 자바스크립트 객체인 movie라는 지역 변수를 생성하고, 이 변수는 "title", "director", "year"와 같은 키를 가진다. 이 객체는 유효한 몽고DB 도큐먼트이며 insearOne 함수를 이용해 movies 컬렉션에 저장할 수 있다.

> db.movies.insertOne(movie)
{
	"acknowledged" : true,
    "insertedId" : ObjectId(/* 생략 */)
}

컬렉션에 find를 호출하면 이렇게 출력된다.

> db.movies.find().pretty()
{
	"_id" : ObjectId(/* 생략 */),
    "title" : "Star Wars: Episode IV - A New Hope",
    "director" : "George Lucas",
    "year" : 1977
}

읽기

> db.movies.findOne()
{
	"_id" : ObjectId(/* 생략 */),
    "title" : "Star Wars: Episode IV - A New Hope",
    "director" : "George Lucas",
    "year" : 1977
}

find와 findOne은 컬렉션을 쿼리하는데 사용하고, 컬렉션에서 단일 도큐먼트를 읽으려면 findOne을 사용한다.
이 둘은 쿼리 도큐먼트의 형태로, 조건 전달도 가능하다.

갱신

> db.movies.updateOne({title : "Star Wars: Episode IV - A New Hope"},
... {$set : {reviews: []}})
WriteResult({"nMatched": 1, "nUpserted": 0, "nModified": 1})

updateOne은 게시물을 갱신하는데 사용한다. 매개변수는 최소 두 개이고 첫 번째는 수정할 도큐먼트를 찾는 기준, 두 번째는 갱신 작업을 설명하는 도큐먼트이다. 이 때, 갱신하기 위해선 갱신 연산자인 $set를 사용한다.

위의 작업으로 도큐먼트에는 "reviews" 키가 생겼다. find로 호출하면 이렇게 출력된다.

> db.movies.findOne()
{
	"_id" : ObjectId(/* 생략 */),
    "title" : "Star Wars: Episode IV - A New Hope",
    "director" : "George Lucas",
    "year" : 1977,
    "reviews" : [ ]
}

삭제

> db.movies.deleteOne({title : "Star Wars: Episode IV - A New Hope"})

deleteOne과 deleteMany는 도큐먼트를 데이터베이스에서 영구적으로 삭제한다. 이 둘은 필터 도큐먼트로 삭제 조건을 지정한다.

데이터형

  • null
  • 불리언
  • 숫자
  • 문자열
  • 날짜 : 새로운 객체를 생성할 땐 new Date()
  • 정규 표현식
  • 배열
  • 내장 도큐먼트 : 키에 대한 값으로 도큐먼트가 되는 것
  • 객체 ID : 몽고DB의 모든 도큐먼트는 고유의 "_id"값을 가진다. (명시하지 않으면 자동생성)
  • 이진 데이터
  • 코드

몽고DB 셸 사용

다른 장비나 포트에 mongod를 연결하려면 셸을 시작할 때 호스트명, 포트, 데이터베이스를 명시해야 함.

$ mongo some-host:3000/myDB
MongoDB shell version: 4.2.0
connecting to: some-host:3000.nyDB
>

만일 셸을 시작할 때 --nodb를 추가하면 어디에도 연결되지 않는다.
이후 new Mongo(호스트명)을 실행함으로써 mongod에 연결한다.

.mongorc.js 만들기

셸이 시작할 때마다 실행되는 스크립트를 .mongorc.js 파일에 넣을 수 있다.
ex. 로그인할 때 사용자를 맞이하는 셸
홈 디렉터리에 .mongorc.js 파일을 만들고 다음을 추가한다.

// .mongorc.js

var compliment = ["attractive", "intelligent", like Batman"];
var index = Math.floor(Math.random()*3);

print("Hello, you're looking particularly "+compliment[index]+" today!");
profile
컴공생의 밍기적

0개의 댓글