Skip to content

2. Create Database / Collection / Document

HeadImg

Reference: MongoDB

이번 시간에는 데이터베이스, 컬렉션, 도큐먼트를 생성하는 방법을 알아본다.

Create and Switch Database

현재 데이터베이스 표시

test> db
test

데이터베이스 사용, 만약에 없으면 첫 레코드가 삽입될 때 데이터베이스가 생성된다.

test> use visiting
'switched to db visiting'
visiting>

Drop Database

우선 데이터베이스를 선택하고 삭제해야 한다.

test> use visiting
visiting> db.dropDatabase();
{ ok: 1, dropped: 'visiting' }

Create Collection

Collection1을 명시적으로 생성하려면 다음과 같이 한다.

> db.createCollection('test1')

도큐먼트를 입력함으로써 명시적으로 만들지 않아도 자동으로 생성된다.

> db.test2.insertOne({ x: 1 })

현재 collections 보기

> show collections

Drop Collection

> db.test1.drop()

Insert Document

하나 혹은 여러 개의 도큐먼트 삽입할 수 있다.

> db.visit.insert({"name": "A", "visit": ["Paris", "London"], "age": 33})
> db.visit.insert([  # (1)
    {"name": "B", "visit": ["London"], "age": 56},
    {"name": "C", "visit": ["Seoul", "London"], "age": 45}
])
  1. 🙋‍♂️ Shift + Enter로 line break 가능.

Filter Document

find 메소드를 사용하여 특정 조건으로 필터링 할 수 있다.

> db.visit.find()  # (1)
> db.visit.find( {"name": "A"} )
> db.visit.find( {"age": { $gt: 40 } } )
> db.visit.find( {"visit": { $in: ["Seoul", "Paris"] } } )
  1. 🙋‍♂️ 전체 데이터 조회, db.visit.find({}) 와 같다. .pretty() 를 붙이면 이쁘게 출력한다.

두번째 인자에 projection 을 추가하여 특정 필요한 필드만 반환 할 수 있다. 0을 주면 해당 필드를 제외하고, 1을 주면 해당 필드만 반환한다. _id 필드만 제외하고, 포함과 제외를 동시에 혼용할 수 없다. 예를 들어, "A" 라는 사람의 레코드를 조회할 때 visit 필드만 반환하고 싶다면, visit 필드만 1 로 두던지, 아니면 다른 두 필드(name, age)를 0으로 두는 것이다.

> db.visit.find( {"name": "A"}, {"_id": 0, "visit": 1} )
> db.visit.find( {"name": "A"}, {"_id": 0, "name": 0, "age": 0} )  # (1)    
  1. 🙋‍♂️ _id 필드만 혼용이 가능하다. 예, db.visit.find( {"name": "A"}, {"_id": 1, "name": 0, "age": 0} )

projection에 여러 연산자를 사용하여 조회를 수행할 수 있다. 예를 들어, $slice 연산자를 사용하여 배열의 첫번째 데이터만 조회할 수 있다.

> db.visit.find( {"name": "A"}, {"_id": 0, "visit": {$slice: 1} } )

Remove Document

remove 메소드를 사용하여 특정 조건을 포함한 데이터 제거

> db.visit.remove( {"name": "A"} )

Aggregate Pipeline

여러 도큐먼트에서 그룹 값을 뽑아내려고 하는 작업을 집계(aggregation)라고 하며, MongoDB에서는 aggregation pipeline2이 집계 작업을 수행한다.

예제1. 각 사람이 방문한 도시의 개수를 세어보고, 개수가 많은 순서대로 정렬해보기

> db.visit.aggregate([
    {  # Pipeline 1: (1)
        $project: {
            _id: "$name",
            countVisit: { $size: "$visit" }
        }
    },
    {  # Pipeline 2: (2)
        $sort: { countVisit: -1 }
    }
])
  1. 🙋‍♂️ _idname 필드를 따르고, countVisitvisit 필드의 길이를 구한다.
  2. 🙋‍♂️ countVisit 필드를 기준으로 내림차순 정렬한다.

예제2. 도시별로 방문했던 사람의 나이를 합산하기

> db.visit.aggregate([
    {  # Pipeline 1: (1)
        $unwind: "$visit"
    },
    {  # Pipeline 2: (2)
        $group: {
            _id: "$visit",
            totalAge: { $sum: "$age" }
        }
    }
])
  1. 🙋‍♂️ visit 필드를 배열로 간주하고, 각 배열의 요소를 도큐먼트로 만든다.
  2. 🙋‍♂️ visit 필드를 기준으로 그룹을 만들고, totalAge 필드에 age 필드의 값을 더한다.

Comments