MongoDB란?

이상우·2021년 10월 5일
0

MongoDB란

MongoDB는 가장 유명한 NoSQL DBMS(Not Only SQL/Database Management System: 전통적인 관계형 데이터베이스보다 덜 제한적인 일관성 모델을 제공하는 DB)이다. 기존 RDBMS(MySQL, ORACLE, PostgreSQL)가 일관성 모델 때문에 가질 수 없었던 확장성, 유연성, 고성능, 고기능성을 확보할 수 있는 특징을 가졌다. 과거에는 하나의 DBMS로 처리하는 상황이 빈번하였지만, 요즘은 처리할 데이터양이 많아서 분산 컴퓨팅이 빈번하다. 그렇기 떄문에 현대적 설계로 고성능을 내면서 동시에 많은 기능과 안정화가 이루어진 NoSQL을 선호한다.

MongoDB에서 지원하는 분산 컴퓨팅 방법

  • 복제: 복사하여 저장하는 방식
    안정성을 높이기 위한 방식. 원본 서버가 망가져도 정상 서비스 가능

  • 샤딩: 나누어 저장하는 방식
    성능을 향상하기 위한 방식. 읽기, 쓰기 성능 향상 가능

RDBMS와 다른 MongoDB의 특징

  • 유연성: NoSQL 데이터베이스는 일반적으로 유연한 스키마를 제공하여 보다 빠르고 반복적인 개발을 가능하게 해준다. 이같은 유연한 데이터 모델은 NoSQL 데이터베이스를 반정형 및 비정형 데이터(데이터구조가 정해져있지 않은 데이터)에 이상적으로 만들어 준다.
  • 확장성: NoSQL 데이터베이스는 일반적으로 고가의 강력한 서버를 추가하는 대신 분산형 하드웨어 클러스터를 이용해 확장하도록 설계되었다. 일부 클라우드 제공자들은 완전관리형 서비스로서 이런 운영 작업을 보이지 않게 처리한다.
  • 고성능: NoSQL 데이터베이스는 특정 데이터 모델 및 액세스 패턴에 대해 최적화되어 관계형 데이터베이스를 통해 유사한 기능을 충족하려 할 때보다 뛰어난 성능을 얻게 해준다.
  • 고기능성: NoSQL 데이터베이스는 각 데이터 모델에 맞춰 특별히 구축된 뛰어난 기능의 API와 데이터 유형을 제공한다.

MongoDB와RDBMS 차이점


출처:https://coding-start.tistory.com/273

MongoDB의 장점

  1. JS에 친화적이다.(내부 명령어를 JS형식으로 사용)
  2. 성능 확장이 쉽다.
  3. 높은 성능을 낼 수 있다.
  4. 유연한 구조로 저장할 수 있다.
  5. 다양한 자료형을 지원한다.

MongoDB 쓰는 경우

  • 프로젝트 언어를 JS로 통일시키고자 할 떄(프론트:React, 백엔드:nodeJS, 서버:MongoDB)
  • 기존의 JSON방식의 DB에서 좀 더 많은 기능과 성능이 필요할 때
  • 파일럿 프로젝트, 즉 앞으로 몇명이 이용할지 예측이 안되는 프로젝트일 경우(상황에 따라 데이터 구조가 쉽게 바꿀 수 있기 때문)
  • 비 정형화된 정보를 전산화(로그 데이터 형식의 정보를 저장할떄, 즉 정보를 정형화하기에 어려운 경우)
  • 안정성보다 높은 성능이 필요한 경우(NoSQL이 기존 DBMS보다 수십배는 더 높은 성능을 가짐)

MongoDB CRUD

MongoDB는 NoSQL이지만, 다른 RDBMS와 같이 CRUD(C:Create(생성),R:Read(조회),U:Update(갱신), D:Delete(삭제))를 제공한다.

pymongomongoDB를 사용할 수 있게 도와주는 파이썬 모듈이다.

import pymongo
connection = pymongo.MongoClient("mongodb://localhost:27017/")
#localhost는 본인 pc내부를 뜻하며, 27017은 MongoDB기본 포트이다.

db = connection.get_database("testDB") 
#접속할 데이터베이스로 접근, 만약 해당 데이터베이스가 없으면 자동으로 생성한 후 접속

collection = db.get_collection("testCollection")
#컬렉션에 도큐먼트 저장, 만약 컬렉션이 없다면 자동으로 생성됨

Create(생성)

Create는 새로운 documents를 collection에 생성하거나 추가하는 동작이다. MongoDB에서는 insert를 통해서 이루어진다. 만약 collection이 존재하지 않는다면 새로 생성한다.

import pymongo
connection = pymongo.MongoClient("mongodb://localhost:27017/")
db = connection.get_database("testDB") 
collection = db.get_collection("testCollection")
하나의 도큐먼트 삽입
result1 = collection.insert_one({document})
여러개 도규먼튼 삽입
result2 = collection.insert_many([{document}, {document}, ...])

print(result1.inserted_id) #입력된 도큐먼트의 id값 출력
print(result2.inserted_id)

Read(조회)

전체 document를 조회하거나, 조건을 입력하여 데이터를 조회한다.

import pymongo
connection = pymongo.MongoClient("mongodb://localhost:27017/")
db = connection.get_database("testDB") 
collection = db.get_collection("testCollection")

result1 = collection.find() #전체 document 조회 find를 통해 조회를 할 수 있다.
result2 = collection.find({"필드명": "값"}) #특정 필드명이 값인 경우를 찾고 싶을 때
print(list(result1)) #MongoDB는 cursor값을 출력하기 때문에 값을 보고 싶으면 list형식으로 출력해야한다.

#특정 필드만 조회하거나 제외하고 싶을 경우
projection = {"필드명": True} #특정 필드만 출력
projection = {"필드명": False} #특정 필드를 제외하고 출력
#동시에 한 필드는 True를 또 다른 필드를 False로 했을 경우 Error발생
#이유는 논리적으로 안맞기 떄문

Update(갱신)

Update는 collection의 documents를 수정하기 위한 동작이다.

import pymongo
connection = pymongo.MongoClient("mongodb://localhost:27017/")
db = connection.get_database("testDB") 
collection = db.get_collection("testCollection")

result = collecton.update_many(
	{query}, #어떤 document를 바꿀지 조건 거는 것
    {update}, #ex) {"$set": {"필드명" : "변경할 값"} $set은 값을 바꾸는 기능을 가진 연산자이다. 여러가지 연산자가 있으니 필요에 맞게 찾아 쓸 것
    upsert: Boolean #True인 경우 해당되는 document가 없다면 새로 추가하기, False인 경우 추가하지않기

Delete(삭제)

Delete는 collection의 documents를 삭제하는 동작이다.
Create와 비슷하게 하나(collection.delete_one) 또는 많은(collection.delete_many) document를 삭제할 수 있다.

import pymongo
connection = pymongo.MongoClient("mongodb://localhost:27017/")
db = connection.get_database("testDB") 
collection = db.get_collection("testCollection")

result = collection.delete_many(
	{query} #어떤 document를 삭제할지 조건을 거는 것
)

참고사이트

https://www.mongodb.com/ko-kr/what-is-mongodb - MongoDB는 무엇입니까?
https://aws.amazon.com/ko/nosql/ - NoSQL 데이터베이스를 사용해야 하는 이유
https://coding-start.tistory.com/273 - DB-MongoDB란?
https://junghwanta.tistory.com/30 - MongoDB CRUD사용(입력,조회,수정,삭제)

profile
구상한것을 구현할 수 있는 개발자가 되고 싶습니다.

0개의 댓글