Lined Notebook

🌱 MongoDB Crash Course

by juraffe juraffe
이 글은 NoSQL 종류 중 하나인 MongoDB를 학습하고 정리한 글입니다. 이 글은 [이곳]을 통해 학습한 내용입니다.

MongoDB Crash Course

설치

❯ docker run --name mongodb-container -d -p 27017:27017 mongo

이 글에서 사용되는 몽고DB는 도커 컨테이너 내부에서 실습하도록 한다. 추가적으로 몽고DB에 접속하기 위한 GUI툴로 Compass를 이용한다. Compass는 맥 환경 기준으로 아래 명령어로 설치할 수 있다.

❯ brew install --cask mongodb-compass

기본 명령어

  • show dbs

모든 데이터베이스 목록을 출력한다.

> show dbs
admin       0.000GB
config      0.000GB
local       0.000GB
playground  0.000GB
  • use <dbname>

<dbname>에 해당하는 데이터베이스를 사용한다. 해당하는 데이터베이스가 없는 경우 새로 생성한다. 단, 콜렉션이 없는 빈 데이터베이스의 경우 show dbs에 의해 표시되지 않는다.

> use playground
switched to db playground
  • show collections

db내 모든 컬렉션 목록을 출력한다.

> show collections
products
  • db

현재 데이터베이스 이름을 출력한다.

> db
playground
  • db.dropDatabase()

현재 선택된 데이터베이스를 삭제한다.

> db.dropDatabase()
{ "ok" : 1 }
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
# playground가 없어짐.
  • db.createCollection('COLLECTION_NAME')

'COLLECTION_NAME'에 해당하는 컬렉션을 현재 선택된 데이터베이스 내에 생성한다.

> db.createCollection('products')
{ "ok" : 1 }
  • db.<collection_name>.insert({ ... }) 

컬렉션에 새 문서를 생성한다. 여기서 배열([]) 형태로 넘겨주면 동시에 여러 개의 문서를 생성할 수 있다.

> db.products.insert({
	name: "Samsung TV",
	price: 99999999999999,
	likes: 999999999999999999,
	tags: ["samsung", "tv", "8k"],
	createdAt: Date()
})
  • db.<collection_name>.find(query, projection)[.pretty()] #Docs

컬랙션내 모든 또는 조건에 맞는 문서를 검색한다. .pretty()를 추가하면 문서의 내용을 가독성 높게 출력해준다.

# 문서내 모든 문서 출력
> db.products.find()
{ "_id" : ObjectId("611790fee525795b0aaa3efa"), "name" : "Samsung TV", "price" : 99999999999999, "likes" : 1000000000000000000, "tags" : [ "samsung", "tv", "8k" ], "createdAt" : "Sat Aug 14 2021 09:46:38 GMT+0000 (UTC)" }

# 출력 내용을 가독성있게 출력.
> db.products.find().pretty()
{
        "_id" : ObjectId("611790fee525795b0aaa3efa"),
        "name" : "Samsung TV",
        "price" : 99999999999999,
        "likes" : 1000000000000000000,
        "tags" : [
                "samsung",
                "tv",
                "8k"
        ],
        "createdAt" : "Sat Aug 14 2021 09:46:38 GMT+0000 (UTC)"
}

# 첫번째 인자값을 줄 경우 문서내 조건에 맞는 문서 검색
> db.products.find({name:"Samsung TV"})
{ "_id" : ObjectId("611790fee525795b0aaa3efa"), "name" : "Samsung TV", "price" : 99999999999999, "likes" : 1000000000000000000, "tags" : [ "samsung", "tv", "8k" ], "createdAt" : "Sat Aug 14 2021 09:46:38 GMT+0000 (UTC)" }
  • db.<collection_name>.find().sort({...})

검색된 문서들을 기준에 따라 정렬한다. 기준에 해당하는 키와 검색할 값, 또는 1, -1을 입력할 수 있는데 1의 경우 오름차순, -1의 경우 내림차순으로 정렬하게 된다.

> db.products.find().pretty().sort({price:-1})
{
        "_id" : ObjectId("611790fee525795b0aaa3efa"),
        "name" : "Samsung TV",
        "price" : 99999999999999,
        "likes" : 1000000000000000000,
        "tags" : [
                "samsung",
                "tv",
                "8k"
        ],
        "createdAt" : "Sat Aug 14 2021 09:46:38 GMT+0000 (UTC)"
}
{
        "_id" : ObjectId("611793b6e525795b0aaa3efb"),
        "name" : "ABCD TV",
        "price" : 1,
        "likes" : 1,
        "tags" : [
                "tv",
                "16bit"
        ],
        "createdAt" : "Sat Aug 14 2021 09:58:14 GMT+0000 (UTC)"
}​
  • db.<collection_name>.find().count()

문서의 개수를 반환한다.

> db.products.find().count()
2
  • db.<collection_name>.find().limit(<num>)

탐색 문서의 개수를 제한한다.

> db.products.find().limit(1)
{ "_id" : ObjectId("611790fee525795b0aaa3efa"), "name" : "Samsung TV", "price" : 99999999999999, "likes" : 1000000000000000000, "tags" : [ "samsung", "tv", "8k" ], "createdAt" : "Sat Aug 14 2021 09:46:38 GMT+0000 (UTC)" }
  • db.<collection_name>.find().forEach(<func>)

검색된 문서를 순회하며 각 문서에 대해 처리한다. 처리할 문서에 존재하지 않은 키에 접근하는 경우 undefined.

> db.products.find().forEach((doc)=>{print('price : ' + doc.price)})
price : 99999999999999
price : 1
price : undefined
  • db.<collection_name>.findOne()

가장 처음 문서를 가져온다.

> db.products.findOne()
{
        "_id" : ObjectId("611790fee525795b0aaa3efa"),
        "name" : "Samsung TV",
        "price" : 99999999999999,
        "likes" : 1000000000000000000,
        "tags" : [
                "samsung",
                "tv",
                "8k"
        ],
        "createdAt" : "Sat Aug 14 2021 09:46:38 GMT+0000 (UTC)"
}
  • db.<collection_name>.update() #Docs

문서를 수정한다. upsert의 경우 대상 문서가 없을 경우 업데이트할 내용을 가지고 새 문서를 생성한다.

> db.products.update({name:"Samsung TV"},{price:99999},{upsert:true})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

여기서 주의할 점은 조건에 걸리는 문서의 요소가 변경되는 것이 아니라 두 번째 데이터로 치환된다. 따라서 일부 키에 해당하는 값을 변경하기 위해선 $set을 사용해야 한다. 자세한 Operator들은 이곳에서 확인할 수 있다.

> db.products.update({name:"ABCD TV"},{$set:{name:"1234 TV"}},{upsert:true})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
  • db.<collection_name>.remove({...})

해당하는 문서를 삭제한다.

> db.products.remove({name:"1234 TV"})
WriteResult({ "nRemoved" : 1 })
  • db.<collection_name>.createIndex({...})

MongoDB에서 빠른 검색을 위한 인덱스를 생성합니다. 인자 값으론 인덱스를 적용한 키와 오름차순, 내림차순을 설정하기 위한 1, -1을 입력한다.

> db.products.createIndex({name:1})
{
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "createdCollectionAutomatically" : false,
        "ok" : 1
}

더 알아보기

'📚 TIL' 카테고리의 다른 글

🌱 MongoDB Crash Course  (0) 2021.08.14
💾 자바 ORM 표준 JPA 프로그래밍 1장  (0) 2021.08.13

블로그의 정보

🦒 Juraffe's note

juraffe juraffe

활동하기