Mongodb는 BSON(JSON의 binary 버전) documents(SQL에서는 대충 row라고 이해하면 됨)으로 데이터를 저장한다.
Mongodb는 이런 document들을 collection(SQL에서는 대충 table이라고 이해하면 됨)이라는 곳에 저장한다.
모든 document들은 _id
라는 field를 필수적으로 갖는다. document의 _id
의 값은 각 컬렌션 속에서도 unique하며 불변성을 갖으며, array를 뺀 모든 type가 될 수 있다. MongoDB에서 알아서 _id
index값을 생성해준다.
데이터베이스 생성
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외에는 잘 사용되지 않는다.
// 사용한다고 선언한 데이터베이스에 이제 값을 입력할 수 있다
// 다큐먼트 생성
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() })
// 생성한 다큐먼트 보기
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 }
ex) db.users.update({ name: 'zero' }, { $set: { comment: '업데이트가 됐나요? 응답응답' } })
> WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
첫번째 객체: 수정할 다큐먼트를 지정하는 객체
두번째 객체: 수정할 내용을 입력하는 객체 → 여기서 $set
을 사용한다
** $set
은 어떤 필드를 수정할지 정하는 연산자다
연산자를 사용하지 않고 일반 객체를 넣는다면 다큐먼트가 통째로 두번째 인자로 주어진 객체로 수정된다. 따라서 일부 필드만 수정하고 싶을 때 반드시 $set
해야함
→ 수정에 성공하면 nMatched, nModified에 1이 나옴
db.users.remove({ name: 'zero' })
WriteResult({ "nRemoved" : 0 })
삭제할 다큐먼트 정보가 담긴 객체를 첫번째 인자로 제공하면 된다. 성공기 삭제된 개수가 반환!
Reference:
MongoDB 공식문서
Nodejs 교괴서