Database/MongoDB

[MongoDB] 1.기본 개념 정리

조슈아。 2024. 9. 10. 22:47
반응형

MongoDB

문서 지향 오픈소스 NoSQL 데이터베이스로 키와 연결된 값의 집합으로 이루어진 Documents 이다

특징

  • 비정형 데이터를 JSON 형식으로 저장
  • 필드, 범위 기반, 문자열 패턴 일치 등 다양한 쿼리를 지원
  • 확장성이 뛰어나며 데이터 파티셔닝 기능이 내장
  • 샤딩을 통해 여러 서버에 워크로드를 분산하여 대용량 데이터를 효율적으로 관리

MongoDB의 주요 구성 요소와 기능

  • Collection(컬렉션) : Document Group으로 RDB에서는 테이블에 해당하며, 동적 스키마를 가진다.
  • Document(도큐먼트) : 관계형 데이터베이스에서는 행에 대응
  • Mongo Shell(몽고 쉘) : MongoDB 인스턴스와 상호작용하는 JavaScript 쉘
  • Sharding(샤딩) : 데이터를 여러 서버로 분산하는 프로세스
  • 인덱싱, 집계, 파일 스토리지 등의 기능을 제공
  • MongoDB는 대규모 데이터 처리, 빠른 확장이 필요한 경우, 또는 데이터 구조가 자주 변경되는 애플리케이션에 적합

기본 사용 방법

1. 데이터베이스 선택 use 'db_name'

use library;

 

2. 현재 DB에 할당된 데이터베이스를 확인 db 입력

db

 

3. 현재 데이터베이스의 컬렉션 반환 db.[collectionName]

db.books

 

4. DB 목록을 확인할 수 있다. show dbs

show dbs;

 

5. 현재 데이터베이스의 컬렉션을 확인할 수 있다. show collections

show collections;

 

6. 데이터베이스의 사용자 확인할 수 있다. show users

show users;

 

7. 현재 데이터베이스의 상태 확인 db.stats()

db.stats()

생성(create), 읽기(read), 갱신(update) 삭제(delete) 네 가지 기본적인 작업을 수행

1. 생성(create)

insertOne() : 1개의 document를 insert

book = {
    "_id": ObjectId(), 
    "title" : "MongoDB", 
    "author": "DevPaik", 
    "publication_year": 2024
    }
db.books.insertOne(book);

insertMany() : 여러 Document를 insert

  • 모든 Document는 16MB 보다 작아야 한다.
  • 도큐먼트 option에 'ordered' 키에 true 를 지정하면 도큐먼트가 제공된 순서대로 삽입된다. false를 지정하면 MongoDB가 성능을 개선하려고 삽입을 재배열할 수 있다.(기본 값 정렬된 삽입)
bookList = [
    { "title" : "MySQL",
      "author": "DevPaik",
      "publication_year": 2024
      },
   { "title" : "MongoDB",
     "author": "DevPaik",
      "publication_year": 2024
    }
]
db.books.insertMany(
    bookList
    ,{"ordered": true}
);

2. 읽기(read)

findOne() - 단일 도큐먼트 조회

db.books.findOne();
db.books.findOne({title: "MongoDB" });

find() - 여러건 조회

db.books.find({title: "MongoDB" });

3. 갱신(update)

키를 추가, 변경, 삭제할 때는 항상 $ 제한자를 사용한다.

updateOne() : 단건 업데이트

db.books.updateOne(
    { title: "MongoDB" },
    { $set: {author: "Chris"} }
);

updateMany() : 여러 건 업데이트

db.books.updateMany(
    { "title": "MongoDB" },
    { $set: { "reviews": "재미있어용" } }
);

 

$set은 필드 값을 설정하고 필드가 존재하지 않을 경우 새 필드가 생성된다. (스키마를 갱신하거나 사용자 정의 키를 추가할 때 편리)

db.books.updateOne({title: "MongoDB"}, {$set: {date: new Date()}});

 

$unset으로 키와 값을 제거할 수 있다.

db.books.updateOne({title: "MongoDB"}, {$unset: {date: null}});

 

$inc 연산자 : 이미 존재하는 키 값을 변경하거나 새 키를 생성하는데 사용

db.books.updateOne({title: "MongoDB"}, {$inc: {loan : 1}})

 

갱신 요청이 동시 발생 시 서버에 먼저 도착한 요청이 적용된 후 다믕 요청이 적용되므로, 여러개의 갱신 요청이 빨리 발생하더라도 결국 마지막 요청이 최종 값으로 변경된다. (기본 동작을 원하지 않을 경우 : Document 비저닝 패턴을 고려)

ReplaceOne() : 도큐먼트를 새로운 것으로 완전히 치환 (스키마 마이그레이션 시 유용)

var book = db.books.findOne({"title" : "MongoDB"});
var book = db.books.findOne({_id : ObjectId("66dfd5bf28a9a762d47dc0ce")});
book.reviews = "재미있다!";
db.books.replaceOne({_id : ObjectId("66dfd5bf28a9a762d47dc0ce")}, book);

 

$push는 배열이 존재할 경우 배열 끝에 요소를 추가하고 존재하지 않을 경우 새로운 배열을 생성한다.

db.books.updateMany(
    { title: "MongoDB" },
    { $push : { "categories" : "IT"} }
);

db.books.updateMany(
    { title: "MongoDB" },
    { $push : { "categories" : "COMPUTER"} }
);

 

$push$each 연산자를 이용하면 한번에 여러 값을 추가할 수 있다.

db.books.updateMany(
    { title: "MongoDB" },
    { $push : { "categories" :{ $each :  ["DB", "NO_SQL"] } } }
);

 

$slice$push를 결합하여 배열이 특정 크기 이상으로 늘어나지 않게 할 수 있다.

db.books.updateMany(
    { title: "MongoDB" },
    { $push : { 
                "categories" :
                        { $each :  ["DB", "NO_SQL"],
                          $slice: -10  //10 제한
                      }
                 } 
             } 
);

 

$pop : 배열 요소 제거

db.books.updateMany(
    { title: "MongoDB" },
    { $pull : { "categories" :"NO_SQL" } }
);

4. 삭제(delete) - 도큐먼트를 DB에서 삭제

deleteOne() : 단건 삭제

db.books.deleteOne({title: "MongoDB"});

deleteMany() : 여러 건 삭제

db.books.deleteMany({title: "MongoDB" });

drop() : 전체 컬렉션 삭제

db.books.drop()

기본 데이터형

null : 존재하지 않는 필드를 표현하는데 사용

{ "author": null}

Boolean : true, false 에 사용

{isDelete: true)

숫자(Number) : 64비트 부동소수점 수를 기본으로 사용

{price: 1000}
{price :1000.5}

4바이트 혹은 8바이트 부호 정수 : NumberInt, NumberLong 클래스를 사용

{price: NumberInt("1000")}
{price :NumberLong("100000")}

문자열

{"title": "MongoDB"}

날짜

1970 1월 1일부터의 시간을 1/1000초 단위로 나타내는 64비트 정수로 날짜를 저장하며, 표준시간 대는 저장하지 않는다.

{"date": new Date()}

정규표현식

{"regex": /MongoDB/i}

배열 : Set or list 를 배열로 표현

{"data": [ {"title" : "MySQL", "author": "DevPaik", "publication_year": 2024}, 
                     {"title" : "MongoDB", "author": "DevPaik", "publication_year": 2024}
                    ]
}

내장 도큐먼트 : 도큐먼트는 부모 도큐먼트의 값으로 내장된 도큐먼테 전체를 포함가능

{data: {"title" : "MySQL", "author": "DevPaik", "publication_year": 2024}}

객체 ID : 도큐먼트용 12바이트 ID

{"_id" : ObjectId()}

코드 : 쿼리와 도큐먼트는 임의의 자바 스크립트 코드를 포함 할 수 있다.

{"script": function() { return this.title + " by " + this.author; } }

 

MongoDB는 하나의 컬렉션에서 모든 Document는 _id Key를 가지며 ObjectId()를 기본으로 생성한다.

반응형