데이터베이스는 과연 왜 필요한가?
데이터를 지속해야 하기 때문이다.
데이터베이스에서 어마어마한 데이터를 효율적으로 저장 압축하고 관리하기 쉽게 만들어준다
데이터를 쉽게 create, read, update, delete 할 수 있다
데이터를 필터링하고 정렬하고 검색할 수 있음
데이터베이스 탑에는 레이어가 하나 있는데
데이터베이스 관리 시스템이다. 보안 기능이나 관리자 접속을 제어하는 등의 기능이 있다
데이터베이스는 저장한 정보를 쉽게 접속하고 찾아내고 정렬하고 다루기 위한 특별한 도구이다.
대량의 데이터를 신속하게 다루기 편리함.
데이터베이스의 보안 및 관리자 제어 등 추가 기능은 매우 효율적임.
데이터베이스의 두 종류
데이터베이스는 크게 SQL과 NoSQL로 나뉜다
Structured Query Language
구조화된 쿼리 언어
즉 기본적인 구문을 공유하는 관계형 데이터베이스이다
MySQL, Postgres, Oracle, Microsoft SQL Server 등이 SQL이다
스키마, 구조 등을 미리 만들어놓고 나서야 사용할 수 있다.
이건 엑셀 도표형식이지만 이런식으로 id, text, post_id처럼 정해진 패턴을 먼저 만들어두고
거기에 새로운 데이터가 추가되는 식이다.
MongoDB, CouchDB, Neo4j, Cassandra, Redis
포괄적이다. 모든 카테고리를 다 때려 넣는다.
유형도 다양하다.
문서 데이터 저장소, 키-값 저장소, 그래프 저장소 등
특정한 패턴을 따르거나 X,Y를 따지느냐를 보아 그렇지 않은 건 전부 다 NoSQL이다.
문서 데이터 저장소를 예로 들면
데이터를 여러 테이블로 나눌 필요가 없다.
따라야 할 스키마와 패턴을 미리 정하지 않아도 된다는 뜻.
대신 데이터를 있는 그대로 가져와 주어진 것에 대한 관련 정보를 데이터베이스의 한 인스턴스 안에 저장.
{
"id": 2,
"author": "T",
"text": "pap",
"comments": [
"asdfa",
"asdfar"
}
}
이렇게 정해진 스키마 없이 하나의 게시글을 객체로 저장하여 작성할 수 있다.
댓글이 없는 게시글은 comments가 없는 식.
훨씬 유연하고 자유롭다.
보통 회사에 따라 두세개의 데이터베이스를 쓴다
mongoDB는 node와 express와 매우 흔히 같이 쓰인다(MERN stack)
시작하기 편하다. (마스터하긴 어려움)
자바스크립트와도 궁합이 좋음
매우 널리 쓰여 강력한 커뮤니티가 존재한다
MySQL같은걸 쓰면 익혀야 할 SQL언어 개념 같은 것들이 많다.
언젠가는 배워야 하지만 처음부터 배우긴 부담스럽다
SQL 데이터베이스 중에서는 MySQL이 선호도 1위
NoSQL 중에서는 MongoDB가 1위다.(전체4위)
수요에서는 MongoDB가 전체 1위
PostgreSQL이 2위(SQL 방식)
https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-os-x/
터미널에서 brew를 통해 설치한다.
직접 입력하지 말고 홈페이지에 기재된 명령어를 복사해서 쓸것.
최신버전에서는 mongosh 로 대체되었다.
MongoDB Shell.
Node REPL 같은 것.
Mongo 코드를 입력하고 평가하면 피드백을 받는다.
새 데이터베이스를 생성하고 그 안의 것을 편집하고 작업하거나 보안이나 관리 권한을 변경할 수 있는 장소.
Mongo 데이터베이스 안에는 각자 내부에 고유의 데이터 세트를 가질 수 있다
데이터베이스라고 하면 Mongo 자체를 지칭할 때도 쓰고 Mongo 안에서 만들거나 사용하는
특정 데이터베이스를 지칭하기도 한다
brew install mongodb-community-shell
mongo
shell을 설치하고 mongo를 입력하면 mongo shell로 들어간다
그 상태에서 자바스크립트 코드를 쓸 수 있음
mongo shell 안에서 다음 명령어를 치면
db // 현재 db가 무엇인지 나타낸다
show dbs // db들을 보여준다
use animalShelter // animalShelter라는 db를 만든다
https://www.mongodb.com/json-and-bson
JSON 같은 것과 비슷하다
키-값 쌍의 데이터 포맷.
JSON에서는 중괄호 {} , 콜론 : , 쌍따옴표를 쓴다 “ “
{
"squadName": "Super hero squad",
"homeTown": "Metro City",
"formed": 2016,
"secretBase": "Super tower",
"active": true,
"members": [
{
"name": "Molecule Man",
"age": 29,
"secretIdentity": "Dan Jukes",
"powers": [
"Radiation resistance",
"Turning tiny",
"Radiation blast"
]
}]
}
이런식.
JSON의 문제는 느리다는 것이다. 텍스트 기반이기 때문에
텍스트 파싱은 느리다.
BSON은 JSON의 Binary이진법 형태이다.
좀 더 압축된 버전이다. 이진법을 써서 스토리지 공간과 속도를 모두 효율적으로 개선했다.
{"hello": "world"} →
\x16\x00\x00\x00 // total document size
\x02 // 0x02 = type String
hello\x00 // field name
\x06\x00\x00\x00world\x00 // field value
\x00 // 0x00 = type EOO ('end of object')
{"BSON": ["awesome", 5.05, 1986]} →
\x31\x00\x00\x00
\x04BSON\x00
\x26\x00\x00\x00
\x02\x30\x00\x08\x00\x00\x00awesome\x00
\x01\x31\x00\x33\x33\x33\x33\x33\x33\x14\x40
\x10\x32\x00\xc2\x07\x00\x00
\x00
\x00
JSON은 문자열, 불리언, 숫자, 배열, 객체, null을 포함하지만
BSON은 문자열, 불리언, 숫자, 배열, null, date, BinData를 포함한다
데이터베이스에 새로운 데이터를 삽입하기
세가지 메서드가 있다
insertOne
insertMany
insert
mongo shell 또는 mongosh에서 입력한다
insertOne은 집합에 작성될 한 가지 혹은 하나의 객체만을 전달한다
db.collection.insertOne()
db.dogs.insertOne({name: "Chalie", age: 3, breed: "corgi"})
dogs라는 collection 안에 객체를 입력했다.
show collections
-> dogs // 라고 뜬다.
db.dogs.find() // dogs 에 들어있는 데이터들이 나타난다
{
_id: ObjectId("6453aedfcd1a670622ca752a"),
name: 'chalie',
age: 3,
breed: 'corgi',
catFriendly: true
}
_id: ObjectId 부분은 자동 생성되었다. 고유 키 같은 것.
ObjectId는 mongo에서 특정 유형이다
따라서 입력할때 직접 쓰지 않으면 자동으로 생성한다. 대부분은 내장된 ID에 의존한다
insertMany는 다수의 값을 삽입할수 있게 해준다
db.collection.insertMany(
[ <document 1> , <document 2>, ... ]
)
insert를 쓰면 둘다 할 수 있다. 하나의 문서 또는 다수의 문서
그러나 최신버전에서는 사용을 비추천한다. insertOne 또는 insertMany를 쓰라고 뜸.
db.collection.find() // 해당 collection에 있는 데이터 모두 표시
db.dogs.find({breed: "corgi"}) // dogs 안에 breed: "corgi"인 데이터 표시. 조건을 여러개 넣을수도 있다
updateOne : 매치되는 첫 항목만
updateMany : 매치되는 모든 항목 업데이트
replaceOne : 문서의 내용을 완전히 대체한다. Id는 유지하면서 값을 대체.
db.dogs.updateOne({name: "chalie"}, {$set: {age: 4}})
// "chalie" 의 age를 4로 업데이트함.
db.dogs.updateOne({name: "chalie"}, {$set: {color: "blue"}})
//없던 키를 넣으면 해당 키-값이 새로 생긴다.
db.cats.updateOne({age:6}, {$set: {age:7}, $currentDate: {lastChanged: true}})
// age 6인 데이터를 age 7으로 바꾸고 currentDate는 중괄호 안(lastChanged) 부분이 어떤 값이든 true이면 현재 날짜로 설정된다.
업데이트할때는 특수 연산자를 쓴다. $set
$set은 필드의 값을 새로운 값으로 대체할 때 사용한다
$currentDate도 있다. 문서에 현재 날짜를 설정할때 사용한다. 마지막 업데이트 날짜를 현재 날짜로 업데이트 하는 것.
db.dogs.updateMany({catFriendly: true}, {$set: {isAvailable: false}})
// catFriendly: true인 데이터 두개가 모두 새로운 키-값을 업데이트 한다.
db.collection.deleteOne()
db.collection.deleteMany()
db.dogs.deleteOne({name: "blue"}) // name이 blue인 데이터 하나 삭제
db.dogs.deleteMany({isAvailable: true}) // isAvailable이 true인 데이터 모두 삭제
db.dogs.deleteMany({}) // dogs 안에 모든 데이터 삭제
$or 연산자나 $It 연산자를 사용하여 조건으로 삭제할 범위를 만들수도 있다
https://www.mongodb.com/docs/v6.0/reference/operator/query/
“personality” : {
"catFriendly" : true,
"childFriendly" : true
}
같은 형태로 데이터 안에 속성이 있다면 이렇게 검색할수 있다
db.dogs.find({"personality.childFriendly": true})
db.dogs.find({"personality.childFriendly": true, size: "M"}) // 두가지 조건으로 검색
조건을 쓸수도 있다
https://www.mongodb.com/docs/v6.0/reference/operator/query/gt/#mongodb-query-op.-gt | Matches values that are greater than a specified value. |
---|
gt 는 greater than 초과
gte 는 greater than or equal 이상
https://www.mongodb.com/docs/v6.0/reference/operator/query/lt/#mongodb-query-op.-lt | Matches values that are less than a specified value. |
---|
lt는 less than
db.inventory.find( { qty: { $gt: 20 } ) // 20 초과을 찾음
db.dogs.find( {age: {$gt: 8}} ) //age 8 초과로 (8은 포함되지 않음)
db.dogs.find( {age: {$gte: 8}} )
https://www.mongodb.com/docs/v6.0/reference/operator/query/in/#mongodb-query-op.-in | Matches any of the values specified in an array. |
---|
여러 조건을 배열에 넣을 수 있음.
db.dogs.find( {breed: {$in: [ "Mutt", "corgi" ] } } ) //breed가 Mutt이거나 corgi인 데이터
$or $and 등 다양한 연산자를 쓸 수 있다.