MongoDB 설치 및 명령어 정리하기

MongoDB 설치 및 명령어 정리하기

Database
MongoDB 설치 및 명령어 정리하기
Author

gabriel yang

Published

November 15, 2023

MongoDB 설치 및 명령어 정리

MongoDB(몽고디비)는 NoSQL 데이터베이스 시스템의 하나로, 문서 지향(Document-Oriented) 데이터베이스입니다. 이것은 데이터를 BSON(Binary JSON) 형식의 문서로 저장하며, 이러한 문서는 키-값 쌍(key-value pairs)으로 이루어져 있습니다. MongoDB는 관계형 데이터베이스와는 달리 스키마가 정의되지 않아 유연성이 높고, 데이터 모델의 변화에 적응하기 쉽습니다.

SQL의 database, table, row를 mongoDB의 구조와 비교해서 테이블로 표시합니다.

MongoDB SQL
Database Database
Collection Table
Document Row
  • Collection : MongoDB에서는 문서의 그룹을 컬랙션이라고 부르며 논리적으로 그룹화하는 방법입니다.

  • Document : MongoDB는 데이터를 문서로 저장합니다. 문서에는 필드 및 값의 쌍으로 구성되며 중첩되는 구조를 갖을 수 있습니다.

mongoDB를 설치한 후 mongosh 명령을 실행하면 mongoDB 쉘에 접속할 수 있습니다. 버전에 따라서 mongo 명령을 사용합니다.

MongoDB 도커로 설치하기

mongo DB를 docker로 설치하는 방법을 정리합니다. 도커를 사용하여 DB를 설치하면 쉽게 DB를 연습할 수 있습니다.

sudo service docker start
sudo service docker status
docker pull mongo
docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
mongo         latest    ee3b4d1239f1   5 weeks ago    748MB
hello-world   latest    9c7a54a9a43c   6 months ago   13.3kB

wsl로 docker를 사용할 때 docker가 정상적으로 실행되지 않는 경우 WSL에 docker설치를 확인하세요.

docker-compose를 이용하여 mongodb를 사용할 수 있습니다. mongo db 이미지의 버전정보는 몽고DB 도커사이트에서 확인할 수 있습니다.

version: "3"

services:
  mongo-db:
    image: mongo
    container_name: mongo-db
    restart: always
    ports:
      - 27017:27017
    volumes:
      - ./data:/data
    environment:
      - MONGO_INITDB_ROOT_USERNAME=DB admin 유저명>
      - MONGO_INITDB_ROOT_PASSWORD=DB admin 암호>

  mongoexpress:
    image: mongo-express
    container_name: mongo-express
    restart: always
    depends_on:
      - mongo-db
    ports: 
      - 8081:8081
    environment:
      - ME_CONFIG_MONGODB_ADMINUSERNAME=<DB admin 유저명>
      - ME_CONFIG_MONGODB_ADMINPASSWORD=<DB admin 암호
      - ME_CONFIG_MONGODB_SERVER=mongo-db
      - ME_CONFIG_BASICAUTH_USERNAME=<mongo express 유저명>
      - ME_CONFIG_BASICAUTH_PASSWORD=<mongo express 암호>

이제 0.0.0.0:8081로 접속해서 유저명과 암호를 입력하면 mongo express를 통해서 mongo db 정보를 확인할 수 있습니다.

MongoDB의 명령어 정리

Mongo DB에서 자주 사용하는 명령어를 정리합니다.

Auth정보로 MongoDB 접속하기

Mongo DB에 admin을 위한 id, password를 설정했다면 해당 정보를 이용하여 DB에 접속해야 합니다.

mongo admin -u username -p 'password'

Database 확인하기

test> show dbs
admin   40.00 KiB
config  60.00 KiB
local   40.00 KiB

Database 만들기 / 확인하기

DB를 생성해도 data가 없는 경우 데이터베이스가 표시되지 않습니다.

test> use testdb
switched to db testdb

testdb> show dbs
admin   40.00 KiB
config  60.00 KiB
local   40.00 KiB

Database 상태 확인하기

정보를 확인할 db를 use명령으로 결정하고 stats명령을 db의 상세 정보를 확인할 수 있습니다.

testdb> use admin
switched to db admin
admin> db.stats()
{
  db: 'admin',
  collections: Long("1"),
  views: Long("0"),
  objects: Long("1"),
  avgObjSize: 59,
  dataSize: 59,
  storageSize: 20480,
  indexes: Long("1"),
  indexSize: 20480,
  totalSize: 40960,
  scaleFactor: Long("1"),
  fsUsedSize: 57764601856,
  fsTotalSize: 1081101176832,
  ok: 1
}

Database에 collection 만들기

testdb에 collection을 생성하는 명령을 정리합니다.

admin> use testdb
switched to db testdb

testdb> db.createCollection("mydoc")
{ ok: 1 }

testdb> show collections
mydoc

Database에 document 만들기

collection 이름을 사용하여 단일 문서 삽입 시 insertOne명령을 사용합니다.

testdb> show collections
mydoc

testdb> db.mydoc.insertOne({name: "john", age:30})
{
  acknowledged: true,
  insertedId: ObjectId("655228d0dc1f13e70f4fcc12")
}

여러문서를 한 번에 삽입하려면 insertMany메서드를 사용합니다. 데이터는 리스트로 전달합니다.

testdb> db.mydoc.insertMany([{name: "mike", age:10}, {name: "tony", age:51}])
{
  acknowledged: true,
  insertedIds: {
    '0': ObjectId("65522a45dc1f13e70f4fcc13"),
    '1': ObjectId("65522a45dc1f13e70f4fcc14")
  }
}

Database에 문서 조회

MongoDB에서 데이터를 확인하고 검색하기 위해서는 find 명령어나 그와 유사한 메서드를 사용합니다. MongoDB의 셸에서 데이터를 확인하는 기본적인 방법은 다음과 같습니다.

# 모든 문서 조회
testdb> db.mydoc.find()
[
  { _id: ObjectId("655228d0dc1f13e70f4fcc12"), name: 'john', age: 30 },
  { _id: ObjectId("65522a45dc1f13e70f4fcc13"), name: 'mike', age: 10 },
  { _id: ObjectId("65522a45dc1f13e70f4fcc14"), name: 'tony', age: 51 }
]

# 조건에 따른 문서조회
testdb> db.mydoc.find({ name: 'john' })
[
  { _id: ObjectId("655228d0dc1f13e70f4fcc12"), name: 'john', age: 30 }
]

# 정렬을 사용한 결과정렬
# age를 오름차순으로 정렬합니다.
testdb> db.mydoc.find().sort({ age: 1})
[
  { _id: ObjectId("65522a45dc1f13e70f4fcc13"), name: 'mike', age: 10 },
  { _id: ObjectId("655228d0dc1f13e70f4fcc12"), name: 'john', age: 30 },
  { _id: ObjectId("65522a45dc1f13e70f4fcc14"), name: 'tony', age: 51 }
]

# 제한된 수의 데이터만 출력합니다.
testdb> db.mydoc.find().limit(2)
[
  { _id: ObjectId("655228d0dc1f13e70f4fcc12"), name: 'john', age: 30 },
  { _id: ObjectId("65522a45dc1f13e70f4fcc13"), name: 'mike', age: 10 }
]

Database에 문서 삭제

문서를 삭제하기 위해서 deleteOne, deleteMany명령을 사용할 수 있습니다.

testdb> db.mydoc.find()
[
  { _id: ObjectId("655228d0dc1f13e70f4fcc12"), name: 'john', age: 30 },
  { _id: ObjectId("65522a45dc1f13e70f4fcc13"), name: 'mike', age: 10 },
  { _id: ObjectId("65522a45dc1f13e70f4fcc14"), name: 'tony', age: 51 },
  { _id: ObjectId("65522be8dc1f13e70f4fcc15"), name: 'mike', age: 12 }
]

testdb> db.mydoc.deleteOne({name: "mike"})
{ acknowledged: true, deletedCount: 1 }

testdb> db.mydoc.find()
[
  { _id: ObjectId("655228d0dc1f13e70f4fcc12"), name: 'john', age: 30 },
  { _id: ObjectId("65522a45dc1f13e70f4fcc14"), name: 'tony', age: 51 },
  { _id: ObjectId("65522be8dc1f13e70f4fcc15"), name: 'mike', age: 12 }
]

deleteMany명령은 조건에 맞는 모든 데이터를 삭제합니다. 테스트를 위해서 동일한 나이를 갖는 데이터를 만듭니다.

testdb> db.mydoc.find()
[
  { _id: ObjectId("655228d0dc1f13e70f4fcc12"), name: 'john', age: 30 },
  { _id: ObjectId("65522a45dc1f13e70f4fcc14"), name: 'tony', age: 51 },
  { _id: ObjectId("65522be8dc1f13e70f4fcc15"), name: 'mike', age: 12 },
  { _id: ObjectId("65522dfadc1f13e70f4fcc16"), name: 'a', age: 15 },
  { _id: ObjectId("65522dfedc1f13e70f4fcc17"), name: 'b', age: 15 },
  { _id: ObjectId("65522e01dc1f13e70f4fcc18"), name: 'c', age: 15 },
  { _id: ObjectId("65522e04dc1f13e70f4fcc19"), name: 'd', age: 15 }
]

testdb> db.mydoc.deleteMany({age: 15})
{ acknowledged: true, deletedCount: 4 }

testdb> db.mydoc.find()
[
  { _id: ObjectId("655228d0dc1f13e70f4fcc12"), name: 'john', age: 30 },
  { _id: ObjectId("65522a45dc1f13e70f4fcc14"), name: 'tony', age: 51 },
  { _id: ObjectId("65522be8dc1f13e70f4fcc15"), name: 'mike', age: 12 }
]

deleteMany명령을 사용해서 age가 15인 document 4개가 모두 삭제되었습니다.

특정 Key정보만 출력하기

DB에서 query로 탐색한 정보 중 특정 key정보만 출력하고 싶은 경우 사용합니다. 선택한 collection의 전체 document 중 date 키 정보만 출력됩니다.

db.test_collection.find({}, {'date':1})

References

  1. https://www.mongodb.com/docs/manual/reference/operator/query/
  2. https://jhleeeme.github.io/mongodb-collection-find/