mongoDB

김무연·2023년 12월 20일

Backend

목록 보기
48/49

NoSQL vs SQL

MySQL같은 SQL 데이터베이스와는 다른 유형의 데이터

  • NoSQL 대표주자인 mongoDB 사용

  • JOIN : 관계가 있는 테이블 끼리 데이터를 합치는 기능 (몽고디비는 aggregate로 흉내 가능)

  • 데이터 형식이 자유롭기 때문에 빅데이터, 메시징, 세션, 관리 등(비정형 데이터)에는 몽고디비 사용하면 좋음

mongo db 만들기

mysql과 마찬가지로 workbench에서 직접 만드는 것 처럼 mongodb compass에서 직접 만들거나, 볼 수 있음

또는 node 명령어로 사용가능

  • use 데이터베이스명으로 생성

  • show dbs 로 목록 확인

  • db로 현재 사용중인 데이터베이스 확인

컬렉션 생성하기 (테이블)

따로 생성할 필요 없음

  • 다큐먼트(row)를 넣는 순간 컬렉션도 자동 생성됨

  • 직접 생성하는 명령어도 있음

  • db.createCollection

  • show collections로 현재 컬렉션 확인

CRUD 작업하기

몽고디비는 컬럼을 정의하지 않아도 됨

  • 자유로움이 장점, 무엇이 들어올지 모른다는 단점
  • 자바스크립트의 자료형을 따름(차이점도 존재)
  • ObjectId: 몽고디비의 자료형으로 고유 아이디 역할을 함
  • insertOne method로 저장
  • 데이터를 하나만 넣을 때는 insertOne, 여러 개 넣을 때는 insertMany

CREATE

nodejs> db.users.insertOne({ name: 'mumu', age: 24, married: false, comment: '안녕하세요. 몽고디비 사용법에 대해 알아봅 시다.', createAt : new Date() });

// 출력
{
  acknowledged: true,
  insertedId: ObjectId('65829aeaeee29277eabe3cf7')
}

insertId란 mysql의 id 즉 primary key, 고유키 라고 생각하면 됨, 자동으로 만들어짐

허나 다른 점은 ObjectID가 랜덤으로 만들어지는것이 아니라 날짜 정보등을 담고 있어서, 아이디를 기준으로 만들어진 순서 정렬등이 가능하다

nodejs> db.users.insertOne({ name: 'mumu22', age: 27, married: true, comment: '안녕하세요. 두 번째 게시물입니다.', createAt : new Date() });
{
  acknowledged: true,
  insertedId: ObjectId('65829b6aeee29277eabe3cf8')
}

ObjectID 가 끝자리가 하나가 올라 간 것을 발견

관계 설정

아까 받았던 ObjectID를 통해 직접 관계를 연결해주어야 함

nodejs> db.comments.insertOne({ commenter: ObjectId("65829aeaeee29277eabe3cf7"), comment: '안녕하세요 mumu의 댓글입니다.', createdAt: new Date()});

// 출력
{
  acknowledged: true,
  insertedId: ObjectId('65829f02eee29277eabe3cf9')
}

위 처럼 comments 테이블의 commenter 이란 컬럼을 users의 Objectid로 연결시켜주면 users와 comments의 로우가 연결이 되며 1대M 관계가 형성됨

mongoDB compass 에서 insert로 직접 JSON 식으로 넣어 입력하는 방법도 있음

다만, MYSQL 같은 경우 foriengy key등을 이용해 검사가 가능한데, mongoDB는 따로 오타 검사를 해주지 않기 때문에, 오타 가 나는지 검사를 잘 해주어야 한다.

데이터 조회 (READ)

  • db.콜렉션이름.find({조건}, {조회할 필드}) 으로 찾을 수 있음
  • findOne()으로 하나만 조회
  • find() 으로 전체 조회
nodejs> db.users.findOne()

// 출력
{
  _id: ObjectId('65829aeaeee29277eabe3cf7'),
  name: 'mumu',
  age: 24,
  married: false,
  comment: '안녕하세요. 몽고디비 사용법에 대해 알아봅시다.',
  createAt: ISODate('2023-12-20T07:42:34.751Z')
}

find의 두 번째 인수로, 조회할 필드(컬럼) 들을 선택할 수 있음 (1은 추가, 0은 제외)

nodejs> db.users.find({}, { name: 1, married: 1});

//출력
[
  {
    _id: ObjectId('65829aeaeee29277eabe3cf7'),
    name: 'mumu',
    married: false
  },
  {
    _id: ObjectId('65829b6aeee29277eabe3cf8'),
    name: 'mumu22',
    married: true
  }
]

여기서 _id:0 을 추가하면 _id를 제외한 값이 출력이 된다.

첫 번째 인수로 조회 조건 입력 가능

nodejs> db.users.find( { name : 'mumu' } )

// 출력

[
  {
    _id: ObjectId('65829aeaeee29277eabe3cf7'),
    name: 'mumu',
    age: 24,
    married: false,
    comment: '안녕하세요. 몽고디비 사용법에 대해 알아봅시다.',
    createAt: ISODate('2023-12-20T07:42:34.751Z')
  }
]
  • $gt, $or 같은 조건 연산자 사용 가능 ( mongoDB에서는 $ 표시를 씀 )
nodejs> db.users.find( { age : { $gt : 20 }, married: true }, { _id: 0, name: 1, age: 1} )

// 출력
[ { name: 'mumu22', age: 27 } ]
  • 정렬은 sort 메서드로 함 (sequlize 는 order ASC=1, DESC=-1)
nodejs> db.users.find( { age : { $gt : 10 }, married: true }, { _id: 0, name: 1, age: 1} ).sort({age: -1})


[ { name: 'mumu22', age: 27 }, { name: 'mumu345', age: 24 } ]
  • limit 메서드로 조회할 다큐먼트 개수 제한 (sequel이랑 동일)
nodejs> db.users.find( { age : { $gt : 10 }, married: true }, { _id: 0, name: 1, age: 1} ).limit(1)


[ { name: 'mumu22', age: 27 } ]
  • skim 메서드로 건너뛸 다큐먼트 개수 제공 (sequelize에서는 offset)
nodejs> db.users.find( { age : { $gt : 10 }, married: true }, { _id: 0, name: 1, age: 1} ).skip(1)
[ { name: 'mumu345', age: 24 } ]

UPDATE

update 메서드로 쿼리

  • 하나만 수정 updateOne, 다중 수정 updateMany
  • 첫 번째 인수로 수정 대상, 두 번째 인수로 수정 내용을 제공
  • $set을 붙이지 않으면 다큐먼트 전체가 수정되므로 주의!!!!!! (조건은 필수)
nodejs> db.users.updateOne({name: 'mumu22'}, {$set: { comment: '수정된 내용입니다.!!!'}})

// 출력
{
  acknowledged: true,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 1,
  upsertedCount: 0
}

DELETE

  • 하나만 삭제 deleteOne, 다중 수정 deleteMany
  • 첫 번째 인수로 삭제할 대상 조건 제공
nodejs> db.users.deleteOne({name: 'mumu22'})
profile
Notion에 정리된 공부한 글을 옮겨오는 중입니다... (진행중)

0개의 댓글