31일차 수업 정리(MongoDB- Connect)
**path 환경 변수 설정
=> 명령어를 입력했을때 명령어를 찾는 위치
=> Mongo db 저장경로 /bin을 추가 후 아래 내역 진행
**mongo DB
=>NoSQL(Not Only SQL)
1. mongo DB Server 실행명령 : 터미널에서 입력(cmd) - 27017포트 사용
- mongod --dbpath 데이터가 저장될 경로
2. mongo DB Client 실행명령 : 새로운 터미널에서 입력
- mongo
- mongo --host IP 또는 도메인 -- port 포트넘버
3. 데이터베이스 생성 및 사용 명령
1) 데이터베이스 사용(>use 데이터베이스명)
=> 존재하는 데이터베이스가 있으면 사용, 없으면 생성 후 사용
2) 데이터베이스 확인 : show dbs
3) 데이터베이스 삭제 : db.dropDatabase()
4. Collection
=> 데이터와 유사한 개념으로 데이터의 집합
1) 생성 - db.createCollection("컬렉션명")
=> 컬렉션을 만들지 않고 데이터 삽입시 자동으로 컬렉션이 생성
2) 조회 - db.getCollectionNames()
3) 제거 - db.컬렉션명.drop()
4) MongoDB 에서 컬렉션 문제
=> MongoDB는 근본적으로 join을 지원하지 않기 때문에 하나의 Collection에 모든 데이터 저장을 권장(이론적)
=> 하지만 하나의 Collection이 커지면 데이터 조회시 오퍼레이션이 많이 필요하게 되어 메모리 캐시 효율이 떨어지게 되기 때문에 현업에서는 데이터를 나누어서 저장하기를 권장(실제)
5. 컬렉션에 데이터 삽입
=> 데이터 삽입시 삽입한 결과가 문자열로 출력
1) 형식 : db.컬렉션명.insert(데이터)
2) 데이터 확인 : db.컬렉션명.find()
실습 - 삽입)
db.users.insert({"id" : "root", "pw" : "1234"})
db.users.find()
=> 데이터를 삽입할 때 작성하지 않은 ObjectID가 _id라는 키로 삽입되어 있음(인덱싱을 위해 mongoDB가 삽입)
실습 - 배열삽입)
db.users.insert([{"id":"user01", "pw":"456"}, {"id":"user02", "pw":"4865"}])
db.users.find()
3) 특정키의 중복을 제거하도록 인덱스 설정
=> db.컬렉션명.createIndex({키이름 : 1}, {unique:true})
db.users.createIndex({id:1},{unique:true})
4) 0~4까지의 이름으로 5개의 데이터 insert
> var num = 10
> for(var i=0; i<5; i++){db.users.insertOne({id:"user"+i,pw:num})}
6. 데이터 수정
1) 형식
db.컬렉션명.update({조건}, {수정할 내용})
=> 수정할 내용만 작성하면 기존 내용이 모두 삭제되고 수정
db.컬렉션명.update({조건}, {$set:{수정할 내용}})
=> 수정할 내용에 있는 부분만 수정
db.컬렉션명.update({조건}, {수정할 내용}, {upsert:true})
=> 조건에 맞는 데이터가 없으면 추가
=> update대신에 updateMany를 호출하면 조건에 맞는 데이터 전부 수정
update는 데이터 1개만 수정
> db.users.update({id:"root"}, {$set:{pw:"4568"}})
{ "_id" : ObjectId("5ec61ba5e1026f2f506a00e0"), "id" : "root", "pw" : "4568" }
> db.users.update({id:"root"}, {pw:"4568"})
{ "_id" : ObjectId("5ec61ba5e1026f2f506a00e0"), "pw" : "4568" }
db.users.update({id:"user4"},{$set{pw:"484848"})
7. 데이터 삭제
- db.컬렉션명.remove({조건})
- db.컬렉션명.deleteOne({조건})
- db.컬렉션명.deleteMany({조건})
8. 데이터 조회
- db.컬렉션명.find(조건, 조회할 컬럼)
=> 모두 생략시 컬렉션의 모든 데이터가 조회
=> 조건 설정시 조건에 맞는 데이터만 조회
=> 조회할 컬럼 입력시 {컬럼명 : 0 or 1, 컬럼명: 0 or 1...}
- 0이면 제외되고, 1이면 포함
=> find 뒤에 사용할 수 있는 함수
- limit(개수) : 개수만큼 가져오기
- skip(개수) : 개수만큼 건너뛰기
- sort({컬럼명 : -1 or 1, 컬럼명 : -1 or 1...})
(1이면 오름차순, -1이면 내림차순)
=> users 컬렉션의 전체 데이터 조회
- db.users.find()
=> users 컬렉션에서 id가 root인 항목만 조회
- db.users.find({id:"root"})
=> users 컬렉션에서 id만 조회(특정 컬럼만 조회)
- 조건절 비우고 조회할 컬럼만 설정
- db.users.find({}, {id:1})
=> users 컬렉션에서 id만빼고 조회
- db.users.find({}, {id:0})
=> 테이블에서 데이터 2개 가져오기
- db.users.find().limit(2)
=> 테이블에서 1개 건너뛰고 id의 내림차순 정렬하여 가져오기
- db.users.find().skip(1).sort({id:-1})
**MongoDB와 Java연동
1. 드라이버파일을 프로젝트에서 사용할 수 있도록 설정
=> Java Application에서는 프로젝트 내에 드라이버 파일을 복사하고 Build path에 추가
=> mongodb-driver, mongodb-driver-core, bson 파일 3개
2. MongoDB 데이터베이스 연결 및 데이터베이스 가져오기 및 컬렉션 연결
MongoClient 접속객체 = MongoClients.create("mongodb://아이피:포트번호");
MongoDatabase 데이터베이스명 = 접속객체.getDatabase("데이터베이스명");
MongoCollection<Document>컬렉션명 = 데이터베이스.getCollection("컬렉션명");
데이터베이스 명 : mymongo
컬렉션 명 : users
3. 전체 데이터 가져오기
MongoCursor<Document> 컬렉션.find().iterator(); //찾아온 데이터들의 cursor가 리턴
=> 커서의 메소드 중에서 hasNext()를 호출하면 다음 데이터의 존재여부, next()는 다음 데이터(Document타입) 리턴
=> Document 타입의 사용법은 Map과 동일(저장할때 사용한 Key를 key로 저장하고 있음)
* => { }안에 있는 부분은 Map 구조
// 1. 전체 데이터 가져오기
// 전체 데이터를 저장할 List를 생성
List<Document> list = new ArrayList<Document>();
// 전체 데이터를 커서로 리턴해주는 메소드를 수행
// 커서 : 데이터의 모임을 순서대로 순회할 수 있도록 해주는 포인터
// iteraator, enumerator, cursor, 빠른열거(for-each)가 유사
MongoCursor<Document> cursor = users.find().iterator();
// 데이터를 순회하면서 list에 하나씩 추가
while (cursor.hasNext()) {
list.add(cursor.next());
}
// 전부 사용했으므로 사용종료
cursor.close();
for (Document document : list) {
System.out.println(document.get("id") + ":" + document.get("pw"));
}
4. 조건에 맞는 데이터 가져오기
=> Map을 이용해서 조건을 만들고 find메소드에 대입
// 2. 조건에 의한 검색
List<Document> list = new ArrayList<Document>();
Map<String, Object> map = new HashMap<>();
map.put("id", "root");
// 전체 데이터를 커서로 리턴해주는 메소드를 수행
// 커서 : 데이터의 모임을 순서대로 순회할 수 있도록 해주는 포인터
// 조건에 맞는 데이터를 찾을 때는 find에 조건을 추가
MongoCursor<Document> cursor = users.find(
new BasicDBObject(map)).iterator();
// 데이터를 순회하면서 list에 하나씩 추가
while (cursor.hasNext()) {
list.add(cursor.next());
}
// 전부 사용했으므로 사용종료
cursor.close();
for (Document document : list) {
System.out.println(document.get("id") + ":" + document.get("pw"));
}
5. 데이터 삽입
=> Document 객체를 만들어서 insertOne 메소드를 호출하고 Document를 매개변수로 대입
// 3. 데이터 삽입
//삽입할 데이터 생성
Document document = new Document();
document.put("id", "fortheking");
document.put("pw", "112233");
users.insertOne(document);
6. 데이터 삭제
=> Document 객체를 만들어서 deleteOne 메소드를 호출하고 Document를 매개변수로 대입
//4. 데이터 삭제(insertOne만 deleteOne으로 바꾸면 끝!)
Document document = new Document();
document.put("id", "fortheking");
document.put("pw", "112233");
users.deleteOne(document);
7. 데이터 수정
=> update 메소드는 Document 객체를 2개 만들고 update 메소드에 대입
=> 첫번째 Document : 수정할 데이터의 조건, 두번째 Document : 수정할 내용
=> id가 root인 데이터의 pw를 9999로 변경
//5. 데이터 수정
//조건에 해당하는 Document생성
Document where = new Document();
where.put("id", "root");
Document set = new Document();
set.put("$set", new Document("pw", "9999"));
users.updateOne(where, set);
**Map
=> Key 와 Value를 쌍으로 저장하는 자료구조
=> 여러개의 데이터를 하나로 묶을 때 많이 사용하는 자료구조
=> Java에서는 Map인터페이스를 제공(인터페이스를 구현한 클래스: hashMap, LinkedHashMap, TreeMap)
=> HashMap은 Key의 순서를 알수없음, LinkedHashmap은 ket의 순서를 기억, TreeMap은 key를 오름차순정렬
1. 생성
=> Map<String, Object> 변수명 = new HashMap<>();
2. 데이터 저장
=> void 변수명.put(String key, Object value);
=> key는 중복될 수 없어서 기존의 key를 입력하면 value가 수정
3. 데이터 읽기
=> Object 변수명.get(String key)
=> 없는 key를 입력하면 null이 리턴
=> 리턴된 데이터를 사용시 원래의 자료형으로 강제 형 변환하여 사용
4. 데이터 삭제
=> void 변수명.remove(String key)
//저번에 다함.
**log.txt 파일에서 IP별 Traffic의 합계를 조회
- 한줄에는 10개의 정보가 기재
- 각 데이터는 공백으로 분할
- 첫 데이터가 IP, 마지막 데이터가 Traffic