1. 몽고디비 설치
- MongoDB가 설치된 폴더에서 bin까지 이동한 후 해당 경로 복사
- path 설정에 들어가 복사한 경로 붙혀넣는다.
- 서비스에서 실행중인지 확인
2. Robo 3T 설치
- Robo 3T에 관련된 페이지
Robo 3T | Free, open-source MongoDB GUI (formerly Robomongo)
Read by Dmitry Schetnikovich
robomongo.org
- 다음 파일을 받아 실행시킨다.
- 이름과 포트번호는 다음과 같이 준다.
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/
Getting Started — MongoDB Manual
Getting Started The following page provides various examples for querying in the MongoDB shell. For examples using MongoDB drivers, refer to the links in the Additional Examples section. Examples Click inside the shell to connect. Once connected, you can r
docs.mongodb.com
https://docs.mongodb.com/drivers/pymongo
https://docs.mongodb.com/drivers/pymongo/
Connect to MongoDB Atlas To connect to a MongoDB Atlas cluster, use the Atlas connection string for your cluster: import pymongo client = pymongo.MongoClient( "mongodb+srv:// : @ /test?retryWrites=true&w=majority") db = client.test
docs.mongodb.com
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 |