mongoDB - 기본 사용법

ryan·2022년 5월 13일
0

mongoDB

  • mongo는 Humongous 에서 따온 말로 엄청나게 큰 db라는 의미
  • 대용량 데이터를 처리하기 좋게 만들어짐

NoSQL vs RDB

RDB(ralational Database)

  • 관계형 데이터 베이스
  • 자료들의 관계를 주요하게 다룸
  • sql 질의어를 사용하기 위해 데이터를 구조화해야 함

NoSQL(not only SQL)

  • 구조화된 질의어를 사용하지 않는 데이터베이스
  • 자료 간의 관계에 초점을 두지 않음
  • 데이터를 구조화하지 않고, 유연하게 저장함

NoSQL을 사용하는 이유

  • sql을 사용하기 위해서는 데이터를 구조화하는 것이 필수 (DDL :Data Definition Language)
    • 스키마에 정의된 데이터가 아니면 저장할 수 없는 제약이 따름
  • NoSQL을 사용하면 사전작업없이 db를 사용할 수 있음
    • db작업에 크게 관여하지 않고 프로젝트를 빠르게 진행할 수 있음

NoSQL과 documentDB

  • 대표적으로 자료를 document로 저장하는 document db가 일반적.
    • 이외에 key-value, Graph,large collection 등의 nosql db가 존재

mongoDB의 기본 개념

Database - collection - document

Database

  • 하나 이상의 컬렉션을 가질 수 있는 저장소

collection

  • 하나 이상의 document저장되는 공간
  • sql의 table과 유사
  • 구조를 정의하지 않음

document

  • mongoDB에 저장되는 자료
  • 구조제약없이 유연하게 저장 가능
  • json과 유사한 bson 사용하여 다양한 자료형을 지원

document - objectId

  • 각 document의 유일한 키 값, sql의 primary key와 유사
  • 하나씩 증가하는 값이 아닌 document를 생성할 때 자동으로 생성되는 값

mongoose odm(object data modeling)이란?

  • mongoDB의 collection에 집중하여 관리하도록 도와주는 패키지
  • collection을 모델화하여, 관련 기능들을 쉽게 사용할 수 있도록 도와줌

사용하는 이유

연결관리

  • mongoDB의 기본 node.js 드라이버는 연결상태를 관리하기 어려움
  • mongoose를 사용하면 간단하게 데이터베이스와의 연결상태를 관리해줌

스키마 관리

  • 스키마를 정의하지 않고 데이터를 사용할 수 있는 것은 nosql의 장점
  • 데이터 형식을 미리 정의해야 코드 작성과 프로젝트 관리에 유용
  • mongoose는 코드레벨에서 스키마를 정의하고 관리할 수 있게 해줌

Populate

  • mongoDB는 기본적으로 join을 제공하지 않음
  • join과 유사한 기능을 사용하기 위해선 aggregate라는 쿼리를 사용해야 됨
  • mongoose는 Populate를사용하여 간단하게 구현 가능

mongoose ODM 사용 순서

스키마 정의 - 모델 만들기 - db 연결 - 모델 사용

스키마 정의

  • Collection에 저장될 Document의 스키마를 Code-Level에서 관리할 수 있도록 Schema를 작성할 수 있음
  • 다양한 형식을 미리 지정하여 생성 수정 작업 시 데이터 형식을 체크해주는 기능을 제공함
  • timestamps 옵션을 사용하면 생성,수정 시간을 자동으로 기록해줌
models/schemas/board.js
const {Schema} = require('mongoose'); // 스키마를 사용하기 위해 mongoose에서 schema 클래스를 가져옴
const PostSchema = new Schema( // 스키마 객체 선언
  {
    title: String, // 데이터타입 선언
    content: String,
  },
  {
    timestamps: true, // timestamps 옵션 추가
  }
);

module.exports = PostSchema;

모델 만들기

  • 작성된 스키마를 mongoose에서 사용할 수 있는 모델로 만들어야 함
  • 모델의 이름을 지정하여 Populate 등에서 해당 이름으로 모델을 호출할 수 있음
models/index.js
const mongoose = require('mongoose'); // 몽구스 패키지 로드
const PostSchema = require('./schemas/board'); // post 스키마 로드
exports.Post = mongoose.model('Post', PostSchema); 
// model함수를 사용하여 post라는 이름으로 postschema와 함께 모델 함수에 전달해서 Post라는 모델을 만들어줬음. 
// Post모델은 export하여 모델 모듈안에서 사용할 수 있도록 만듬.

데이터베이스 연결

  • connect 함수를 이용하여 간단하게 데이터베이스에 연결할 수 있음
  • mongoose는 자동으로 연결을 관리해주어 직접 연결 상태를 체크하지 않아도 모델 사용시 연결 상태를 확인하여 사용이 가능할 때 작업을 실행함.
// 데이터베이스 연결
const mongoose = require('mongoose');
const {Post} = require('./models');
mongoose.connect('mongodb://localhost:27017/myapp');
// 데이터 베이스에 연결하는데 문제가 있어도 포스트를 바로 사용하게 되면 오류가 발생하지 않고 연결될때까지 기다렸다가 완료되면 post가 실행되는 연결 관리 기능을 제공함

모델 사용

간단한 CRUD
CREATE - create
READ - find, findById, findOne
UPDATE - updataOne, updataMany, findByIdAndUpdate, findOneAndUpdate
DELETE - deleteOne, deleteMany, findByIdAndDelete, findOneAndDelete

// Create
async function main() {
  const created = await Post.create({
    title: 'first title',
    content: 'second title',
  });
  const multipleCreated = await Post.create([item1, item2]);
}
// create 함수를 사용하여 Document 생성
// create 함수에는 Document Object(단일 document 생성)나 Document Object의 Array(복수 document 생성) 전달 가능
// create는 생성된 document를 반환해줌

// READ (find)
async function main2() {
  const listPost = await Post.find(query);
  const onePost = await Post.findOne(query);
  const postById = await Post.findById(id); // object 아이디를 바로 검색할 수 있음  
}
// find 관련 함수를 사용하여 Document를 검색
// query를 사용하여 검색하거나 findById를 사용하면 ObjectID로 Document를 검색할 수 있음

// UPDATE
async function main3(){
    const updateResult = await Post.updateOne(query, {...})
    const updateResults = await Post.updateMany(query, {...})
    const postById = await Post.findByIdAndUpdate(query, {...})
    const onePost = await Post.findOneIdAndUpdate(query, {...})

}
// update 관련 함수를 사용하여 Document를 수정
// find~ 함수들은 검색된 document를 업데이트를 반영하여 '반환'해줌 변수로 받을 수 있다. 
// mongoose의 update는 기본적으로 $set operator를 사용하여, Document를 통째로 변경하지 않음


// DELETE
async function main(){
    const deleteResult = await Post.deleteOne(query);
    const deleteResults = await Post.deleteMany(query);
    const onePost = await Post.findOneIdAndDelete(query);
    const postById = await Post.findByIdAndDelete(query);
}
// delete 관련 함수를 사용하여 Document 삭제
// find~ 함수들은 검색된 document를 반환해 줌
profile
프론트엔드 개발자

0개의 댓글