[NoSQL] MongoDB 기본 명령어 && CRUD

셀레스틴 허·2021년 6월 12일
0
post-thumbnail
post-custom-banner

MongoDB

Mongodb는 BSON(JSON의 binary 버전) documents(SQL에서는 대충 row라고 이해하면 됨)으로 데이터를 저장한다.

Mongodb는 이런 document들을 collection(SQL에서는 대충 table이라고 이해하면 됨)이라는 곳에 저장한다.

모든 document들은 _id라는 field를 필수적으로 갖는다. document의 _id의 값은 각 컬렌션 속에서도 unique하며 불변성을 갖으며, array를 뺀 모든 type가 될 수 있다. MongoDB에서 알아서 _id index값을 생성해준다.

MongoDB CRUD && 명령어

데이터베이스 생성

use [데이터베이스]
// ex) use practice

데이터베이스 목록 확인

show dbs

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

db

컬렉션은 따로 생성할 필요 없음 - 다큐먼트를 넣는 순간 컬렉션이 자동 생성된다

// but 생성하고 싶다면 
db.createCollection('users')
{ "ok" : 1 }

생성한 컬렉션 확인

// collection create
show collections

Date, 정규표현식 같은 자바스크립트 객체를 자료형으로 사용할 수 있고, binary data, ObjectId, int, long, decimal, timestamp, javascript 등의 추가적인 자료형이 있다.
undefined, symbol은 몽고디비에서 자료형으로 사용하지 않는다. 추가적인 자료형 중에서 ObjectId, binary data, timestamp외에는 잘 사용되지 않는다.

ObjectId는 mysql에서 기본 키로 쓰이는 값과 비슷한 역할을 한다고 생각하면 된다

👌 Create

// 사용한다고 선언한 데이터베이스에 이제 값을 입력할 수 있다 
 
// 다큐먼트 생성
db.컬렉션명.save(다큐먼트)
ex) db.users.save({ name: 'samsung', age: 90, married: true, comment: '몽고디비 5.0이 나오다니...', createdAt: new Date() });

// samsung의 ObjectId를 찾아야함 
ex) db.users.find({ name: 'samsung' }, {_id : 1})
> { "_id" : ObjectId("60c2b6f64b62786f59a003cd") }

// samsung이 코멘트를 남긴다는 가정 
ex) db.comments.save({ commenter: ObjectId('60c2b6f64b62786f59a003cd'), comment: '몽고디비야 듣고 있니??', createdAt: new Date()  })

👌 Read

// 생성한 다큐먼트 보기 
find({})를 통해 컬레션 내의 모든 다큐먼트를 조회할 수 있음 

ex) db.users.find({})
{ "_id" : ObjectId("60c2b6d04b62786f59a003cc"), "name" : "zero", "age" : 24, "married" : false, "comment" : "몽고디비 잘 부탁해", "createdAt" : ISODate("2021-06-11T01:05:20.426Z") }
{ "_id" : ObjectId("60c2b6f64b62786f59a003cd"), "name" : "samsung", "age" : 90, "married" : true, "comment" : "몽고디비 5.0이 나오다니...", "createdAt" : ISODate("2021-06-11T01:05:58.056Z") }

// 특정 필드 조회

ex) db.users.find({}, {_id:0, name:1, married:1})
{ "name" : "zero", "married" : false }
{ "name" : "samsung", "married" : true }

find 메서드의 두번째 인자로 조회할 필드를 넣는다. 1 또는 true로 표시한 필드만 가져온다. 
_id는 기본적으로 가져오기 때문에 0 또는 false로 표시해서 가져오지 않도록 주의

// $gt를 활용해서 초과된 값만 가져오기 
ex) db.users.find({ age: { $gt: 30 }, married: true }, { _id: 0, name: 1, age: 1 })
{ "name" : "samsung", "age" : 90 }

// 쿼리 옵션 두개
ex) db.users.find({ $or: [{ age: { $gte: 30 } }, { married: false }] }, { _id: 0, name: 1, age: 1 })
{ "name" : "zero", "age" : 24 }
{ "name" : "samsung", "age" : 90 }

✌️ 몽고디비 쿼리 옵션

- $gt : greater than 
- $lt : less than
- $gte : greater than or equal to 
- $lte : less than or equal to 
- $ne : not equal
- $or : or
- $in : in (배열 요소 중 하나)

✌️ 정렬 : sort 메소드 쓰기

-1: 오름차순
1: 내림차순

→ 쿼리 옵션과 다르게 .find()뒤에 붙인다 
ex) db.users.find().sort('SORT_OPTION')

ex) db.users.find({}, { _id: 0, name: 1, age: 1 }).sort({ age: -1 })
{ "name" : "samsung", "age" : 90 }
{ "name" : "zero", "age" : 24 }

✌️ 조회할 수 있는 다큐먼트 개수를 설정할 수 있음 - limit 메서드 사용

ex)  db.users.find({}, { _id: 0, name: 1, age: 1 }).sort({ age: -1 }).limit(1)
{ "name" : "samsung", "age" : 90 }

👌 Update

기존 데이터 수정하기

ex) db.users.update({ name: 'zero' }, { $set: { comment: '업데이트가 됐나요? 응답응답' } })
> WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

첫번째 객체: 수정할 다큐먼트를 지정하는 객체

두번째 객체: 수정할 내용을 입력하는 객체 → 여기서 $set을 사용한다

** $set 은 어떤 필드를 수정할지 정하는 연산자다

연산자를 사용하지 않고 일반 객체를 넣는다면 다큐먼트가 통째로 두번째 인자로 주어진 객체로 수정된다. 따라서 일부 필드만 수정하고 싶을 때 반드시 $set 해야함

수정에 성공하면 nMatched, nModified에 1이 나옴

👌 Delete

db.users.remove({ name: 'zero' })
WriteResult({ "nRemoved" : 0 })

삭제할 다큐먼트 정보가 담긴 객체를 첫번째 인자로 제공하면 된다. 성공기 삭제된 개수가 반환!

Reference:
MongoDB 공식문서
Nodejs 교괴서

profile
Software Developer / 고통은 필연, 괴로움은 선택
post-custom-banner

0개의 댓글