1. 몽고디비 설치
- MongoDB가 설치된 폴더에서 bin까지 이동한 후 해당 경로 복사
- path 설정에 들어가 복사한 경로 붙혀넣는다.
- 서비스에서 실행중인지 확인
2. Robo 3T 설치
- Robo 3T에 관련된 페이지
- 다음 파일을 받아 실행시킨다.
- 이름과 포트번호는 다음과 같이 준다.
3. NoSQL
<빅데이터>
- 기존: 관계형 데이터베이스(RDBMS)
- SQL 언어로 사용 가능
- SQL 데이터베이스
- 빅데이터: NoSQL 데이터베이스
<NoSQL 이해>
- Not only SQL
- RDBMS의 한계를 극복하기 위해 만들어진 새로운 형태의 데이터저장소
- RDBMS처럼 고정된 스키마 및 JOIN 이 존재하지 않음
- 스키마 변경? ALTER 등 필요 없음
- https://redis.io/ : 메모리 서버, 실제사용자가 어떤 서버로 요청할 지 모름, clustering으로 묶은 서버는 session을 공유해야해, 공유안되면 정보 끊어짐. redis같은 곳에 session정보를 저장해놓으면 서로 공유해서 사용할 수 있음
- https://cassandra.apache.org/ : 확장성, 고가용성
- https://neo4j.com/ : 가장 대중적인 그래프 데이터베이스 관리 시스템
mongoDB 설치 및 환경 구축
1. mongodb 설치 방법 (맥 환경)
- Homebrew 프로그램을 사용해서 설치하는 것이 가장 쉬움
- https://brew.sh/index_ko
- /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
- Homebrew 설치 후
- brew install mongodb
- mongodb 설치 후
- mongod 또는 brew services start mongodb
2. mongodb 설치 방법 (윈도우 환경)
- https://www.mongodb.com/download-center/community 이동 후, .msi 파일 다운로드 및 설치
- 참고 블로그: https://javacpro.tistory.com/64
<mongoDB 바로 다뤄보기>
- mongodb의 데이터 구성
- db, collection으로 구성
- 데이터는 각 collection에 document 형식(python dictionary)으로 저장 됨
- collection들의 논리적인 집합이 database
1. Robomongo 설치 (MongoDB 관리 GUI 툴) (실습)
Robo 3T (formerly Robomongo)
- https://robomongo.org/download
- 맥에서 처음 실행시 잘 안되면, 삭제 후, 다시 다운로드받아서 재설치하세요
2. Robomongo에서 커멘드 입력해보기 (실습)
- Right-click (Server) -> Open Shell
- show dbs - 전체 데이터베이스 열람
- use [DB 이름] - 데이터베이스 선택 (없으면 데이터베이스 생성)
- 예) use python_db - dave_db 데이터베이스 선택
- show collections - 선택된 데이터베이스의 콜렉션 열람
- db.[Collection 이름].함수() 로 해당 컬렉션의 데이터 열람 및 조작
- 예) db.my_col.find() - my_col 컬렉션에서 전체 Document 검색
- 데이터베이스 생성 - use python_db
- 데이터베이스 현황 확인 - db, db.stats()
- collection 생성 및 삭제
- db.createCollection("employees", {capped:true, size:10000})
- Right-click (server) -> Click Refresh -> Go to dave_db -> Go to Collections -> Check employees
- capped:true 최초 제한된 크기로 생성된 공간에서만 데이터를 저장하는 설정 (고성능, 저장공간차면 기존 공간 재사용, 일정시간만 저장하는 로그에 적합)
- db.employees.isCapped()
- db.employees.drop()
- db.createCollection("employees", {capped:true, size:10000})
- collection 확인
- show collections
- db.employees.stats()
- collection 이름 변경
- db.employees.renameCollection("emp")
- collection 삭제
- db.employees.drop()
3. SQL과 간단 비교 - mongodb collection 생성/변경
- collection 생성 (원하는 타입으로 데이터를 바로 넣으면 됨)
- PRIMARY KEY를 위한 별도 컬럼 만들 필요 없음.
- mongodb는 collection에서 _id가 각 Document마다 자동생성되어 primary key 역할을 함
- 컬럼마다 데이터 타입을 정할 필요 없음 ("컬럼명": 컬럼값 이 기본 형태임)
3.1 DDL SQL vs Mongo DB
- collection 구조 변경 (기존 Document에 컬럼 추가/삭제 필요없을 시는 새로운 Document에만 필요한 컬럼을 추가 또는 삭제해서 넣으면됨)
- ALTER TABLE은 기본적으로 collection에서는 필요 없음
- 일부 기존 Document에도 컬럼과 컬럼값을 넣거나 삭제해야 한다면 다음과 같은 형태로는 가능함
- 기존 Document에도 컬럼과 컬럼값 추가시
- SQL: ALTER TABLE people ADD COLUMN join_date DATETIME
- mongodb: db.people.updateMany({ }, { $set: { join_date: new Date() } })
- 기존 Document에도 컬럼과 컬럼값 삭제시
- SQL: ALTER TABLE people DROP COLUMN join_date
- mongodb: db.people.updateMany({ }, { $unset: { "join_date": "" } })
<mongoDB 데이터 입력/검색/수정/삭제 (CRUD)>
- Create, Insert Operation은 컬렉션(Collection)에 도큐먼트(Documents)를 삽입합니다.
- 만약 컬렉션이 아직 존재하지 않는다면, 도큐먼트 삽입과 동시에 컬렉션이 생성됩니다.
- 모든 Mongo DB의 삽입 연산은 단일 컬렉션을 대상으로 한다.
1. Document 입력 - insertOne, insertMany
- insertOne : 한개의 document 생성
- insertMany : list of document 생성
- Document 입력 문법
- SQL INSERT 문법과 비교
- insertOne 예제
db.people.insertOne( { user_id: "bcd001", age:45,status:'A' } )
- insertMany 예제
db.people.insertMany([
{ user_id: "bcd002", age:25,status:"B" },
{ user_id: "bcd003", age:50,status:"A" },
{ user_id: "bcd004", age:35,status:"A" },
{ user_id: "abc001", age:28,status:"B" }
])
2. Document 읽기(검색) - findOne, find
- findOne : 매칭되는 한개의 document 검색
- find : 매칭되는 list of document 검색
- Document 읽기(검색) 문법
3. Document 수정 문법
4. Document 삭제 - deleteOne, deleteMany
- 삭제 작업 (Delete Operations)은 컬렉션 내의 도큐먼트를 삭제합니다.
- Mongo DB에서의 삭제 작업은 단일 Collection을 대상으로 합니다.
- Document 삭제 - deleteOne, deleteMany
- deleteOne - 매칭되는 한개의 document 삭제
- deleteMany - 매칭되는 list of document 삭제
참고
: mongo shell
- 로컬에서 서버가 돌아갈 경우,
: mongo
- 원격 서버에 접속할 경우
: mongo --host 'host_address' --port 'port'
: 예) mongo --host 192.10.21.3 --port 27017
- SQL to Aggregation Mapping Chart
https://docs.mongodb.com/manual/reference/sql-aggregation-comparison/#examples
4. Robo 3T 에서 MongoDB 사용하기
- 데이터베이스 생성
- 생성할 데이터베이스 이름 주기
- 생성 완료
- Collection(테이블) 생성
- Collection(테이블) 이름 주기
- Collection(테이블) 생성 완료
- 데이터 삽입하기(Insert)
- 다음과 같이 Json형태로 값을 넣고 Save 한다.
- collection(테이블)에 document(행)가 추가된 모습
- 데이터를 조회해본다.
- update 하기
5. Datagrip 에서 MongoDB 사용하기
- 기존에 MariaDB만 되어있었기 때문에 MongoDB를 추가해준다.
- + 버튼 클릭 > Data Source > MongoDB 클릭 > Test connection 완료한 뒤 확인하면 생성 완료
- python_db 라는 디비 생성한 뒤 people이라는 이름을 가진 collection(테이블)을 생성하는 명령어 작성
//python_db 생성
use python_db
//people collection 생성
db.createCollection('people')
- 하지만 새로고침을 해도 보이지 않는다.
- 실제로 테이블이 내 눈에 보이게 설정하기 위해, MongoDB오른쪽 클릭 > Database Tools > Mongo Shown Schemas 클릭
- Current schema, python_db 체크
- 체크 후 다시 새로고침을 했더니 내 눈으로 collection을 확인할 수 있다.
- MongoDB 명령어 연습하기
//python_db 생성
use python_db
//people collection 생성
db.createCollection('people')
//isCapped()
db.people.isCapped() //false
//collection stats 정보
db.people.stats()
//emp collection 생성하고 drop
db.createCollection('emp')
//emp -> employees로 rename
//db.emp.renameCollection('employees')
db.emp.drop()
//document(row) 1개 insert : insertOne()
db.people.insertOne({user_id:'bcd001',age:45, status:'A'})
//select * from people
db.people.find()
db.people.find({})
//select _id, user_id, age from people
db.people.find({},{user_id:1,age:1})
//select user_id, status from people
db.people.find({},{user_id:1,age:1,_id:0})
//document 여러개insert : insertMany()
db.people.insertMany([
{ user_id: "bcd002", age:25,status:"B" },
{ user_id: "bcd003", age:50,status:"A" },
{ user_id: "bcd004", age:35,status:"A" },
{ user_id: "abc001", age:28,status:"B" }
])
db.people.find().limit(2)
//select * from people where status = 'A'
db.people.find({status:'A'})
//select user_id, status from people where status = 'A'
db.people.find({status:'A'},{user_id:1,status:1,_id:0})
// select * from people where status != 'A'
db.people.find({status:{$ne:'A'}})
// select user_id, status,age from people where user_id != 'abc001'
db.people.find({user_id:{$ne:'abc001'}},{user_id:1,status:1,age:1,_id:0})
// select * from people where status='A' and age=50
db.people.find({status:'A',age:50})
//select * from people where status='A' and age=50
db.people.find({$or:[{status:'A'},{age:50}]})
//select status, age from people where status='A' or age = 50
db.people.find({$or:[{stauts:'A'},{age:50}]},{status:1,age:50,_id:0})
//select * from people where age>25
db.people.find({age:{$gt:25}})
//select * from people where age < 50
db.people.find({age:{$lt:50}})
//select * from people where age > 25 and age < 50
db.people.find({age:{$gt:25,$lt:50}})
//select * from people where age in (25,15)
db.people.find({age:{$in:[25,15]}})
//status = 'C', user_id = 'sn0716' document 추가 , age필드는 넣지마
db.people.insertOne({'user_id':'sn0716','status':'C'})
db.people.find()
//status가 'A'이거나'C'인 것 조회
db.people.find({status:{$in:['A','C']}})
//select * from people where age not in (5,25)
db.people.find({age:{$nin:[5,25]}})
//select * from people where user_id like '%cd%'
db.people.find({user_id:{$regex:/cd/}})
//select * from people where user_id like 'bc%'
db.people.find({user_id:{$regex:/^bc/}})
//select * from people where user_id like '%01'
db.people.find({user_id:{$regex:/01$/}})
//select * from people status='A' order by user_id asc
db.people.find({status:'A'}).sort({user_id:1})
//select user_id, age, status from people status='A' order by age desc
db.people.find({status:'A'},{_id:0,user_id:1,age:1,status:1}).sort({age:-1})
//select user_id, age from people where user_id like '%cd%' and age > 40 order by user_id asc
db.people.find({user_id:{$regex:/cd/},age:{$gt:40}},{user_id:1,age:1,_id:0}).sort({user_id:1})
//select user_id, status, age from people where age >= 25 and age < 45 and status in('A','B')
db.people.find({age:{$gte:25,$lte:45},status:{$in:['A','B']}},{user_id:1,status:1,age:1,_id:0})
//select count(*) from people
db.people.count()
//db.people.find().count() - 예전엔 됐는데 deplicated돼서 안됨
//select count(*) from people where age > 30
db.people.count({age:{$gt:30}})
//user_id필드의 값이 존재하는 row count
db.people.count({user_id:{$exists:true}})
db.people.find({user_id:{$exists:true}})
//age 필드의 값이 존재하지 않는 row count
db.people.count({age:{$exists:false}})
db.people.find({age:{$exists:true}})
//select distinct(status) from people
db.people.aggregate([{$group:{_id:"$status"}}])
db.people.findOne({age:{$gte:25}})
db.people.find().limit(1)
db.people.find().limit(3).skip(1)
//updateMany
//update people set status='C' where age >= 45
db.people.updateMany({age:{$gte:45}},{$set:{status:'C'}})
db.people.find()
//update people set age = age + 10 where status = 'B'
db.people.updateMany({status:'B'},{$inc:{age:10}})
//updateOne
//update people set age=100 where user_id='bcd001'
db.people.updateOne({user_id:'bcd001'},{$set:{age:100}})
//update people set age = age + 7 where status='B'
db.people.updateOne({status:'B'},{$inc:{age:7}})
//delete from people where status='C'
db.people.deleteMany({status:'C'})
db.people.find()
db.people.updateMany({status:'B'},{$set:{size:100}})
- 연습문제
//1.employee_db 생성
use python_db
//2.employees 컬렉션 생성
db.createCollection('employees')
//3. employees 컬렉션 capped 확인
db.employees.isCapped()
//4. employees 컬렉션 statistics 확인
db.employees.stats()
//5.document 추가 insertMany() 사용
/*
{"number":1001,"last_name":"Smith","first_name":"John","salary":62000,"department":"sales", hire_date:ISODate("2016-01-02")},
{"number":1002,"last_name":"Anderson","first_name":"Jane","salary":57500,"department":"marketing", hire_date:ISODate("2013-11-09")},
{"number":1003,"last_name":"Everest","first_name":"Brad","salary":71000,"department":"sales", hire_date:ISODate("2017-02-03")},
{"number":1004,"last_name":"Horvath","first_name":"Jack","salary":42000,"department":"marketing", hire_date:ISODate("2017-06-01")},
*/
db.employees.insertMany([
{"number":1001,"last_name":"Smith","first_name":"John","salary":62000,"department":"sales", hire_date:ISODate("2016-01-02")},
{"number":1002,"last_name":"Anderson","first_name":"Jane","salary":57500,"department":"marketing", hire_date:ISODate("2013-11-09")},
{"number":1003,"last_name":"Everest","first_name":"Brad","salary":71000,"department":"sales", hire_date:ISODate("2017-02-03")},
{"number":1004,"last_name":"Horvath","first_name":"Jack","salary":42000,"department":"marketing", hire_date:ISODate("2017-06-01")},
])
//6.document select all
db.employees.find()
//7.SELECT * FROM employees WHERE department='sales';
db.employees.find({department:'sales'})
//8.select * from employees where hire_date > "2017-01-01"
db.employees.find({hire_date:{$gt:new Date("2017-01-01")}})
//9.select number,last_name,first_name from employees
db.employees.find({},{_id:0,number:1,last_name:1,first_name:1})
//10.select number,last_name,first_name from employees where number=1003
db.employees.find({number:1003},{_id:0,number:1,last_name:1,first_name:1})
//11.select * from employees where number = 1001 and department = 'sales'
db.employees.find({number:1001,department:'sales'})
//12.select * from employees where number = 1002 or department = 'sales'
db.employees.find({$or:[{number:1002},{department:'sales'}]})
//13.select * from employees where number in (1001,1003)
db.employees.find({number:{$in:[1001,1003]}})
//14.select * from employees where number not in (1001,1003)
db.employees.find({number:{$nin:[1001,1003]}})
//15.select * from employees where last_name like '%e%'
db.employees.find({last_name:{$regex:/e/}})
//16.select * from employees where firs_name like '%a%'
db.employees.find({first_name:{$regex:/a/}})
//17.select * from employees where first_name like 'B%'
db.employees.find({first_name:{$regex:/^B/}})
//18.select * from employees where last_name like '%h'
db.employees.find({last_name:{$regex:/h$/}})
//19.select * from employees order by department
db.employees.find().sort({department:1})
//20.select * from employees order by hire_date desc
db.employees.find().sort({hire_date:-1})
//21.select count(*) from employees
db.employees.count()
db.employees.find()
//23.insertOne
//insert into employees (number,last_name,first_name,salary,department,status) values (1005,'Hong','Gildong',55000,'clerk','A')
db.employees.insertOne({number:1005,last_name:'Hong',first_name:'Gildong',salary:55000,department:'clerk',status:'A'})
//insert into employees (number,last_name,first_name,salary,department,status) values (1006,'박','둘리',50000,'clerk','B')
db.employees.insertOne({number:1006,last_name:'박',first_name:'둘리',salary:50000,department:'clerk',status:'B'})
//24.select * from employees where status = 'A'
db.employees.find({status:'A'})
//25.select * from employees where status in ('A','B)
db.employees.find({status:{$in:['A','B']}})
//26.status column이 존재하는 document 조회!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
db.employees.find({status:{$exists:true}})
//27.status column이 존재하지 않는 document 조회@@@@@@@@@@@@@@@@@@@@@
db.employees.find({status:{$exists:false}})
//28.hire_date column이 존재하는 document 조회@@@@@@@@@@@@@@@@@@@@@
db.employees.find({hire_date:{$exists:true}})
//29.hire_date column이 존재하지 않는 document 조회@@@@@@@@@@@@@@@@@@@@@
db.employees.find({hire_date:{$exists:false}})
//30.status column이 존재하는 document count 조회@@@@@@@@@@@@@@@@@@@@@
db.employees.count({status:{$exists:true}})
//31.hire_date column이 존재하는 document count 조회
db.employees.count({hire_date:{$exists:true}})
//32.select distinct(department) from employees
db.employees.aggregate([{$group:{_id:"$department"}}])
//33.select * from employees where salary >= 50000
db.employees.find({salary:{$gte:50000}})
//34.select * from emploees where salary < 50000
db.employees.find({salary:{$lt:50000}})
//35.select * from employees where salary > 45000 and salary <= 60000
db.employees.find({salary:{$gt:45000,$lte:60000}})
//36.update employees set salary = 57000 where number = 1005
db.employees.updateMany({number:1005},{$set:{salary:57000}})
db.employees.find()
//37.update employees set last_name = '홍' where number = 1005
db.employees.updateMany({number:1005},{$set:{last_name:'홍'}})
//38.update employees set salary = salary + 100 where number in (1005,1006)
db.employees.updateMany({number:{$in:[1005,1006]}},{$inc:{salary:100}})
//39.delete from employees where status = 'A'
db.employees.deleteMany({status:'A'})
//update() operation uses the $unset operator to remove the fields status and salary
//number가 1006 인 document의 status , salary 필드값 제거하기
db.employees.update(
{ number: 1006 },
{ $unset: { status: "", salary: 0 } }
)
db.employees.find().explain()
6. 기타 참고자료
https://docs.mongodb.com/manual/tutorial/getting-started/
https://docs.mongodb.com/drivers/pymongo
7. 숙제
MVC(Model View Controller)패턴 / MVT(Model View Template)패턴 차이점 알아오기
'데이터베이스 > MongoDB' 카테고리의 다른 글
Cine21_MongoDB저장_검색 (0) | 2020.08.04 |
---|---|
MongoDB aggregate 연습문제 (0) | 2020.07.31 |
MongoDB 집계함수 (0) | 2020.07.30 |