Mongo DB 설치
wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
sudo apt-get update
sudo apt-get install -y mongodb-org
MongoDB 패키지 설정
echo "mongodb-org hold" | sudo dpkg --set-selections
echo "mongodb-org-server hold" | sudo dpkg --set-selections
echo "mongodb-org-shell hold" | sudo dpkg --set-selections
echo "mongodb-org-mongos hold" | sudo dpkg --set-selections
echo "mongodb-org-tools hold" | sudo dpkg --set-selections
MongoDB 서비스 상태 확인
sudo systemctl status mongod
sudo systemctl start mongod
sudo systemctl status mongod
실행 명령어
- mongo
테이블 확인
- show dbs;
테이블 사용
- use test
- test 테이블이 존재하지 않으면 만들어준다.
데이터 삽입 및 조회
db.encore.insert({name: "Chang", age : 35 });
db.encore.insert({name: "Min", age : 25,address : 'Suwon' });
db.encore.find();
db. <- 현재 테이블을 가리킴
encore <- 컬렉션 이름
insert 데이터 넣어준다. 안에 키 value 쌍을 넣어주어야 함.
- RDBMS는 빈자리에 null을 넣던가 해야 하는데 이를 Schema에 의존적이라고 한다.
- MongoDB는 Json으로 저장하고, key:value 쌍으로 저장되기 때문에 Schema- less 하다.
예쁘게 출력
- db.encore.find().pretty()
- id, name, age, adderss가 Key 값이다.
- : 기준 뒤에 있는 값들이 Value 값이다.
- {}가 한 문서 단위이고 위 사진은 2개의 문서가 있는 것이다.
- key와 value를 하나로 묶은 것을 fileld라고 한다. 위 문서는 각각 3,4개의 field를 가진다.
- 문서가 많아지면 문서 개수를 확인하기 어려워진다.
문서 개수 확인하기
- db.encore.find().count()
MongoDB의 쉘의 특징
- MongoDB 쉘은 JS처럼 사용이 가능하다.
for (var i = 0 ;i < 100; i ++) {db.encore.insert({number : i})}
db.encore.count()
Collection 지우기
db
show collections
db.encore.drop()
show collections
예제 데이터 넣기
db.people.insertMany([{"name" : "chang", "gender" : "Male"},
{"name" : "byeong", "gender" : "Female"},
{"name" : "Chang" , "gender" : "Male"}])
find()로 특정 키값으로 찾기
- db.people.find({gender : "Male"});
- 대소문자를 구분함
$or vs $and
- db.people.find( {$or : [{name : "chang"}, {gender : "Female"}]});
- and도 동일하게 사용 가능하다.
갱신 Update
- test 키의 값이 "test Post"인 문서를 찾아 review의 키와 빈 값을 갱신
- $set 함수를 이용하여 update할 수 있음.
- 함수의 첫 번째(test:"test Post")는 수정할 문서를 찾는 매개변수, 함수의 두 번째($set:{review: []})는 갱신 작업을 설명하는 필드
- db.people.update({name: "chang"},{$set: {age : '20'}});
삭제
- deleteOne 함수를 이용하여 삭제할 키와 값을 입력하면 해당 문서가 삭제됨.
- 해당 문서를 삭제하여 컬렉션의 내부 문서는 비었지만, 컬렉션을 삭제하지 않았기 때문에 컬렉션은 유지되어 있고, 조회 함수인 find()를 사용해도 데이터는 조회되지 않음.
- db.people.deleteOne({name : "chang"}); 로 삭제 가능
MongoDB 기본 데이터형
- null : null 값과 존재하지 않는 필드를 표현
- {“x” : null}
- 불리언 : 참과 거짓 판단 유무에 사용
- {“x” : true}
- 숫자 : 정수, 소수점 가능
- {“x” : 3.14}, {“x” : 3}
- 문자열 : UTF-8 문자열 형태로 표현
- {“x” : “foobar”}
- 날짜 : 1970년 1월 1일부터 1/1000초 단위로 64비트 정수형
- {“x” : new Date()}
- 정규 표현식 : 자바스크립트의 정규 표현식 문법이 가능
- {“x” : /foobar/i}
- 배열 : 값의 셋이나 리스트를 배열로 표현
- {“x” : [“a”, “b”, “c”]}
- 내장 문서 : 문서 내의 문서가 가능
- {“x” : {“foo” : “bar”}}
내장 문서
- {
“name” : “John Doe”,
“address” : {
“street” : “123 Park Street”,
“city” : “Anytown”,
“state” : “NY”
}
} - “address”의 키의 대한 값은 “street”, “city”, “state”의 키/값 쌍을 가질 수 있음
배열
- {“things” : [“pie”, 3.14]}
- 배열은 서로 다른 데이터형을 값으로 표현
문서 삽입
- insertOne 함수를 통해 하나의 문서 입력 가능
- 다수의 문서를 컬렉션에 입력하기 위해서는 insertMany 함수를 사용
- 48MB보다 입력하는 문서가 크다면 일괄 삽입 할 수 없음
- 만약 48MB 이상의 문서를 입력한다면, 48MB 크기로 분할되어 일괄 삽입됨.
db.people.insertOne({"name" : "chang", gender : "Male", age : "20" })
"_id" 주의
- 입력하는 문서에서 중복되는 "_id"를 가지는 경우 에러가 발생하고 입력되지 않음.(_id는 절대로 중복될 수 없다.)
- 에러 내용을 살펴보면, duplicate key error(중복된 키 에러)로 인해 세 번째 문서에서 에러가 발생함.
db.fruit.insertMany([{"_id" : 0, "name" : "apple"},
{"_id" : 1, "name" : "banana"},
{"_id" : 1, "name" : "orange"},
{"_id" : 2, "name" : "cherry"}])
- 중복 이전 데이터는 들어가는 것을 볼 수 있음.
- ordered 옵션을 사용하면 동일하게 에러는 나지만 중복되는 것을 제거하고 나머지는(뒤에 입력한 문서도) 정상 입력됨을 볼 수 있다.
db.fruit.insertMany([{"_id" : 3, "name" : "orange"},
{"_id" : 4, "name" : "cherry"},
{"_id" : 4, "name" : "strawberry"},
{"_id" : 5, "name" : "tomato"}],
{"ordered" : false})
문서 삭제
- deleteOne은 하나의 문서만 지우기 때문에 동일한 값이 있다면 앞의 값이 지워진다.
db.fruit.deleteOne({"_id" : 4});
- deleteMany 함수를 이용하면, 필터와 일치하는 모든 문서를 삭제한다.
컬렉션 삭제
- 일반적으로 문서를 삭제하는 작업은 처리 시간이 오래 걸리지 않는다.
- 하지만 문서가 많아 컬렉션이 무겁고, 필터를 하나하나 작성하여 삭제하는 방법은 번거롭다.
- 따라서 drop 함수를 이용하여 컬렉션을 제거하는 것이 빠름
- db.fruit.drop()
문서 갱신
- updateOne, updateMany, replaceOne 함수 이용
- updateOne과 updateMany는 필터 문서를 첫 번째 매개변수로, 변경 사항을 적용하는 키와 값을 두 번째 매개변수로 사용
- replaceOne도 첫 번째 매개변수로 필터를 사용하지만, 두 번째 매개변수는 필터와 일치하는 문서를 교체할 문서로 사용
- updateOne, updateMany
- 문서의 필요한 부분(필드)을 수정
- replaceOne 은 첫 줄에 있는 내용의 문서를 찾아서 아래 줄에 있는 내용으로 바꿔라 라는 명령이다.
db.fruit.replaceOne(
{"name" : "apple"},
{"name": "apple" ,"price" : "1000"}
)
- upsert 옵션 : update + insert
- 조건에 일치하면 교체하지만, 없다면 새로 입력
db.fruit.replaceOne(
{"name" : "apple"},
{"name": "apple" ,"price" : 1000},
{upsert : true}
)
$inc 제한자
- $Inc 제한자는 필터 조건과 일치하는 키의 값을 증가시킬 수 있음
- 값의 수정이 아닌 "증가"시키는 제한자이기 때문에 한번 더 수행하면 마지막 결과에서 10이 더 증가하게 된다.
- 음수 값 ("-")도 지원하기 때문에 {"inc" : {"age" : -10}} 을 수정할 필드로 설정하면 값이 감소한다.
db.fruit.updateOne(
{"name" : "apple"},
{"$inc" : {"price" : 100}}
)
- 문서 안에 내장 문서가 존재하는 경우 .을 찍어 내장문서 안으로 이동하도록 지정할 수 있다.
$set 제한자
데이터 삽입
db.people.insert({
name : "Lee Eun Jin",
gender : "Female"
})
- $set 제한자를 통해 키의 데이터형도 수정이 가능
- "name" 키의 값이 "
- $inc 제한자와 마찬가지로 내장 문서로의 접근도 가능
db.people.updateOne(
{ "name" : "Lee Eun Jin") },
{ $set: { hobby: "Piano" } }
)
- $set 제한자를 통해 키의 데이터형도 수정이 가능하다.
- Lee Eun Jin을 찾아서 그 문서의 hobby값을 다수의 값으로 수정
db.people.updateOne(
{ "name" : "Lee_Eun_Jin" },
{ $set: { hobby: ["Piano", "Make Coffee", "Watch Movie"] } }
)
$unset 제한자
- $unset 제한자는 문서 내 필드의 키와 값을 제거(삭제)
- 1 = true를 뜻하므로 해당값이 있으면 지우라는 뜻
db.people.updateOne(
{name : "Lee_Eun_Jin"},
{$unset : {hobby : 1 }})
$push 제한자
- $push 제한자는 배열이 이미 존재하면 배열 끝에 요소를 추가하고, 존재하지 않으면 새로운 배열을 생성
- "scores" 키의 값이 [44,78, ...] 배열 형태로 되어 있을 때 $push 제한자를 통해 해당 키의 값에 "89" 요소를 추가한 모습
$each 제한자
- $each 제한자는 $push와 함께 사용할 수 있으며, 작업 한 번으로 여러 개의 값을 추가할 수 있음.
- "_id" 키에 해당하는 값이 존재하는 문서를 찾고, 값을 추가한 모습
db.students.updateOne(
{_id : 1},
{$push : {scores: {$each: [90,92,85]}}
})
$sort 제한자 $slice 제한자
값 넣어주기
- quizzes 키의 값이 wk와 score 키와 해당 값을 가진 배열로 입력
db.students.insertOne(
{
"_id" : 2,
"quizzes" : [
{ "wk": 1, "score" : 10 },
{ "wk": 2, "score" : 8 },
{ "wk": 3, "score" : 5 },
{ "wk": 4, "score" : 6 }
]
}
)
- sort 제한자는 오름차순(1) , 내림차순(-1)으로 정렬
- slice 제한자는 배열에 추가할 수 있는 요소의 개수 제한.
- wk 1~4까지 데이터가 존재했는데, wk 5~7까지 데이터가 입력된 후 내림차순으로 정렬된 후 상위 값 3개가 출력된 결과이다.
db.students.updateOne(
{ _id: 2 },
{
$push: {
quizzes: {
$each: [ { wk: 5, score: 8 }, { wk: 6, score: 7 }, { wk: 7, score: 6 } ],
$sort: { score: -1 },
$slice: 3
}
}
}
)
'Back > MongoDB' 카테고리의 다른 글
MongoDB와 Python 연동하기 (0) | 2023.05.18 |
---|---|
Mongo DB 실습 - 3 (0) | 2023.05.18 |
Mongo DB 이론 - 2 (0) | 2023.05.17 |
Mongo DB 실습 - 2 (0) | 2023.05.17 |
MongoDB 이론 - 1 (0) | 2023.05.17 |