반응형

**mongo db

1.mongo db설치

=>windows용은 msi버전(gui tool compasss를 같이 설치할 수 있는 옵션)을 다운로드 받아서 설치해도 되고 zip버전을 받아서 압축을 풀어도 됩니다.

 

2.mongo db서버 실행

=>mongo db 디렉토리에 가면 bin디렉토리에 있는 mongod라는 명령으로 서버를 실행

cmd > mongod --dbpath데이터베이스파일경로

C:\mongodata

mongod -dbpath C:\mongodata

 

=>처음 실행하는 경우에는 데이터베이스 파일이 저장될 디렉토리를 생성

 

=>명령어를 편리하게 사용할려면 bin디렉토리를 path환경변수에 추가해주면 됩니다.

 

3.mongo db클라에언트 실행(접속하는 것)

1)mongo db를 설치하면 mongo라는 command line기반의 접속 프로그램 제공

mongo db설치 디렉토리 안의 bin이라는 디렉토리에 존재

 

자신의 컴퓨터에서 실행 중인 데이터베이스 접속할 때는 아래 명령

cmd > mongo

 

원격에 있는 컴퓨터의 mongo db 접속

cmd > mongo –-host ip주소 :포트번호

cmd > mongo –-host ip주소 --port포트번호

ip주소 대신에 도메인도 가능

 

 

 

2)gui program을 설치해서 접속

=>가장 많이 사용하는 프로그램은 robomongo

https://studio3t.com/download-thank-you/?OS=win64

참조 사이트 : https://soye0n.tistory.com/149

 

 

4.데이터 저장 단위

database -> collection (table) ->document(- row)->field( -column)

1)데이터베이스 생성 및 사용

use 데이터베이스이름

=>없는 데이터베이스 이름을 사용하면 새로 생성되고 있는 데이터베이스 이름을 사용하면 접속

 

2)컬렉션 생성 및 사용

=>생성 명령 : db.createCollection(“컬렉션 이름”)

=>없는 컬렉션이더라도 db.컬렉션이름.insert()을 하게 되면 자동으로 생성

:

TABLE

이름

점수

 

 

 

 

 

 

5.데이터 저장

1. 데이터 표현

=>하나의 객체: {“속성이름”:데이터, ... }

=>여러 개의 데이터:[데이터 나열] – 값만 나열해도 되고 객체를 나열해도 됩니다.

 

2)데이터 삽입 함수

=>insert

db.컬렉션이름.insert(데이터)

데이터에 배열을 대입하면 배열을 분해해서 하나하나 삽입합니다.

mongo db는 최상위 루트에 배열을 허용하지 않습니다.

[]->이것으로 시작하는 것이 없고 {}것으로 된다.

 

=>데이터 확인 함수

db.컬렉션이름.find()

 

 

=>실습

데이터베이스 사용 명령: > use sample

데이터 삽입 명령 :   > db.users.insert({"name":"kim",score:90})              

> db.users.insert([{"name":"lee",score:80},{"name":"park","score":95}])

데이터 확인:      >db.users.find()

 

=>데이터를 확인해보면 직접 삽입하지 않은 _id라는 필드에 ObjectId라는 데이터가 삽입되어 있는데 이 필드는 직접 입력하지 않으면 mongo db document를 구분하기 위해서 자동으로 삽입하는 값입니다.

mongo db에서 id라는 필드를 만드는 것은 권장하지 않습니다.

 

=>insertOne insertMany함수를 이용해서 데이터를 삽입하는 것도 가능

insertOne은 하나의 데이터를 삽입할 때 사용하고 insertMany는 여러 개의 데이터를 삽입할 때 사용합니다.

 

3)데이터 삽입할 때 옵션

ordered 라는 옵션이 있는데 이 옵션은 데이터를 여러 개 삽압할 때 사용할 수 있는 옵션인데

ordered true로 설정되면 싱글 스레드를 이용해서 데이터를 삽입하는데 이 의미는 데이터를 순서대로 하나씩 삽입하는 것이고 ordered false로 설정하면 멀티 스테드를 이용해서 데이터를 삽입하는데 데이터를 동시에 삽입합니다.

 

차이점은 중간에 오류가 발생했을 때 ordered true이면 오류가 발생한 지점부터 데이터가 삽입되지 않습니다.

false로 설정되면 오류가 발생한 데이터만 삽입되지 않고 나머지 데이터는 삽입이 됩니다.

 

대량의 데이터를 약간의 오류를 무시하고 빠르게 삽입할려면 ordered옵션을 false로 설정합니다.

옵션이 없을 경우 ture

4)ordered옵션의 차이를 알아보기 위한 실습

users의 모든 데이터 삭제 >db.users.drop()

 

동일한 name을 삽입하면 오류를 발생시키기 위해서  name필드를 유일한 인덱스로 설정

users에 유니크 한 인덱스 설정 >db.users.createIndex({name:1},{unique:true})

db.users.insert({"name":"kim",score:90})

db.users.insert([{"name":"lee",score:80},{"name":"kim","score":95},{"name":"park","score":95}],{ordered:true})

db.users.find()

=>결과로 kim lee만 조회됩니다.

kim을 삽입할 때 오류가 발생해서 그 이후 데이터는 삽입되지 않습니다.

 

ordered  true일 경우 오류나면 뒤에는 안 들어간다.

ordered false일 경우 같이 들어가서 들어간다.

관계형 db는 제약조건 위반이면 무조건 안들어간다.

 

 

db.users.insert([{"name":"lee",score:80},{"name":"kim","score":95},{"name":"park","score":95}],{ordered:false})

db.users.find()

=>중간에 오류가 발생하더라도 park이 삽입됩니다.

동시에 삽입했기 때문에 데이터가 삽입될 때 다른 부분에 오류가 발생한 것은 상관하지 않습니다.

 

_id 수정,저장 조회 등 가능하는데 잘 하지 않는다.

 

=>기본적으로 single thread

mongo db

node.js

 

5).mongo db의 옵션에 대한 이행

잘못된 옵션을 사용해도 오류가 발생하지 않는 경우가 있습니다.

자바스크립트 함수는 필요한 옵션만 추출해서 사용하기 때문입니다.

 

6).ObjectId 직접 생성

=>_id 필드에 직접 값을 설정하는 것이 가능

=>ObjectId(“문자열 24자리”)로 생성할 수 있고 일련번호 처럼 new ObjectId()로 생성이 가능

=>inert함수를 이용해서 _id값을 직접 입력하면 동일한 값이 있을 때 에러를 발생시키고 save는 동일한 값이 있으면 수정을 합니다.

일련번호 형식으로 바꾼다. 일련번호 갑자기 바꾸는 것은 thread등 사용했기 때문이다.

var temp = new ObjectId()

print(temp)

 

패턴을 있으면

 

6.robomongo –mongo db에 접속해서 사용할 수 있는 gu tool

=>mongo db이 데이터를 sql형식으로도 조회 가능

 

use sample

db.users.find()

 

=>connect를 만들고  intellishell을 열면 명령어를 입력해서 결과 확인 가능

=>sql을 열면 sql 을 입력해서 mongo db의 데이터 사용가능

 

7.데이터 수정

1)수정메소드

update, updateOne, updateMany, replaceOne 추가

 

2)update함수

db.컬렉션이름.update({조건},{수정할 내용},{옵션})

=>옵션은 생략하면 기본값으로 설정

=>기본적으로 조건에 맞는 데이터 1개만 수정합니다.

 

3)수정 실습

샘플 데이터 1개 삽입

db.users.insert({"name":"강감찬",score:90})

 

수정 해주는 함수 호출

db.users.insert({"name":"강감찬"},{score:80})

 

별다른 옵션 없이 수정할 내용을 입력하면 수정할 내용으로 데이터가 대체됩니다.

위의 경우 name:강감찬 , score:90이라는 데이터가 score:80으로 대체됩니다.

 

db.users.find()

 

이름이 날라간다.

 

4)수정 내용에 설정하는 옵션

$set: 특정 필드만 수정할 때 사용

$unset:특정 필드를 제거

$inc : 특정 필드의 값에 더하기  => 조회수

$mul:특정 필드의 값에 곱하기

$rename :필드이름 변경

$currentDate: 현재 시간으로 설정  =>글을 수정한 날짜

 

데이터 1개 삽입

db.users.insert({"name":"굴리트","score":98,"nation":"holland"})

db.usres.find()

 

굴리트의 score 99로 수정

db.users.update({"name":"굴리트"},{$set:{"score":99}})

db.users.find()

 

 

굴리트의 nation 필드를 삭제

db.users.update({"name":"굴리트"},{$unset:{"nation":99}})

db.users.find()

굴리트의 score필드의 값을 5증가

db.users.update({"name":"굴리트"},{$inc:{"score":5}})

db.users.find()

 

굴리트의 lastModified필드의 값을 현재 시간으로 설정

db.users.update({"name":"굴리트"},{$currentDate:{"lastModified":true}})

db.users.find()

 

5)update 3번째 옵션

upsert:true로 설정하면 조건에 맞는 데이터가 없으면 insert

(update insert)

db.users.update({"name":"반바스텐"},{$set:{"score":89}})

db.users.find()

=>위의 경우는 조건에 맞는 데이터가 없어서 아무일도 발생하지 않습니다.

 

db.users.update({"name":"반바스텐"},{$set:{"score":89}},{upsert:true})

db.users.find()

조건에 맞는 데이터가 없으므로 반바스텐 89라는 데이터가 삽입

 

마지막 로그인 user의 시간을 업데이트 할때

한번도 로그인 하지 않는 분도 입력할 수 있다.

로그인 이력 : 로그인 id, 시간

a 12시에 로그인하면 수정하면 되는데

b가 없을 경우 13시에 업데이트 해야 하는데 없을 경우 추가한다.

 

multi:true로 설정하면 조건에 맞는 모든 데이터가 수정

(기본은 false여서 하나만 수정된다.)

 

 

RDBMS(관계형 데이터베이스)

테이블 설계

기본키 모든 데이터를 유일하게 구분

인덱스 설정

기본키로 하면 빨리 찾을 수 있다.

 

게시글

게시글 번호 (pk)

제목

내용

댓글은 내용(여러개 있을 수 있어서 게시글 테이블에 추가하면 안된다.)

 

댓글번호

게시글 번호

댓글 내용

 

 

 

 

 

 

 

 

 

 

join을 한다. 그래서 늦어 질 수 있다.

댓글 접고 원본글 내용에서 보다가 댓글클릭시 댓글만 조회된다.

 

 

No SQL

테이블 설계과정이 없다.

게시글번호

제목

내용

댓글 [{댓글번호: , 내용: }]

따로 따로 만들어서 join 을 할 필요없다.

$set

$push

$pull

 

stack

queue

push pop/pull(javascript)

 

카카오 spring hibernate

게시판

저장의 개념

변수  (프로그램 끝다 키면 없어진다.) 일시적이다.

파일 영구적으로 저장할 목적이다. 파일은 다른 데서 사용하려면 피씨가 켜져있어야 한다.

서버 외부에 파일로 저장 주기적으로 백업하고 켜놓는다.------------->저장 을 db(검색에 특화)

 

스마트폰은 컴퓨터이지만 서버로 될수 없다 돌아다니면서 IP가 변한다

내 카카오하고 친구 카카오 통신 하려면 중간에 고정 IP로 한다.

카카오 -> 카카오 서버 -> 애플서버 -> 친구 카카오에게 보낸다.(스마트폰 욺직이여서 )

서버 는 고정적인 이름(도메인)이나 주소(IP)가 있어야 한다.

 

6)필드에 배열이 있을 때 수정

배열에 데이터를 추가할 때$push

배열에서 데이터를 제거할 때는 $pul을 사용

 

//reply라는 필드에 배열을 소유하고 있는 데이터 생성

db.board.insert({"board_num":1,"board_id":"ggangpae1","board_title":"가입인사","board_content":"안녕하세요 반갑습니다.","reply":[]})

db.board.find()

 

board_num 1번인 데이터의 reply에 데이터를 추가

db.board.update({"board_num":1},{$push:{"reply":{"reply_num":1,"reply_content":"환영합니다.","reply_id":"admin","reply_time":ISODate("2019-1231T12:19:00")}}})

 

//2019-1231 날 짜만 할 겨우

//z는 더 아래 단위 천...

board_num 1번이고  reply_num 1번인 데이터의 content time을 수정

db.board.update({"board_num":1, "reply.reply_num":1},{$set:{"reply.$":{"reply_num":1"reply_content":"안녕.", "reply_time":ISODate("2019-1231T12:26:00")}}})

 

board_num 1번인 데이터의 reply_num 1번인 데이터를 삭제

db.board.update({"board_num":1},{$pull:{"reply":{"reply_num":1}}})

 

각각의 작업을 수행하고 match가 몇개 되는지 확인

조건에 맞는 데이터가 없으면 match된 데이터가 없다고 나옵니다.

옵션들에 따옴표를 해도되고 하지 않아도 됩니다.

 

8.데이터 삭제

remove()

deleteOne()

deleteMany()

 

=>remove의 첫번째 매개변수는 삭제할 조건입니다.

두번째 매개변수는 justOne이라는 옵션인데 true로 설정하면 1개만 지워지고 생략하거나 false로 설정하면 조건에 맞는 데이터가 모두 삭제됩니다.

 

9.컬렉션 삭제는 drop입니다.

board_num 1인 데이터 모두 삭제

 

db.board.remove({"board_num":1})

db.board.find()

 

board라는 컬렉션을 삭제

db.board.drop()

db.borad.find()

 

10.MOngo DB에서 documnet를 삽입 ,삭제,갱신 하는 것도 중요하지만 mongo db는 자식 테이블을 별도로 만들지 않고 부모 테이블에 배열의 형태로 저장하기 때문에 배열의 데이터를 삽입,삭제 ,갱신하는 것도 중요합니다.

 

11.bulkWrite

=>삽입 ,삭제 , 갱신을 동시에 수행할 수 있는 함수

=>insertOne,updateOne,updateMany, deleteOne,deleteMany함수를 사용

 

삽입과 수정을 하나의 명령어로 수행하도록 bulkWrite 사용

//90으로 여고 88로 변경된다.

db.board.bulkWrite([{insertOne:{"document":{"name":"kim","score":90}}},{updateOne:{"filter":{"name":"kim"},"update":{$set:{"score":88}}}}])

 

db.board.find()

 

 

12.데이터 검색

=>find()함수 이용

=>첫번째 매개변수로 조건을 설정하고 두번째 매개변수로 조회할 필드를 설정

=>매개변수를 아무것도 대입하지 않으면 컬렉션의 모든 데이터 조회

 

1).users컬렉션의 모든 데이터 조회

db.users.find()

 

2)특정 필드만 출력하거나 제외

=>두번째 매개변수에 {필드이름:0 또는 1,...}

=>0이 설정되면 출력하지 않고 1이 설정되면 조회

 

users에서 _id name만 조회

>db.users.find({},{"name":1})

usres에서 name만 제외

>db.users.find({},{"name":0})

db.users.find({},{"name":1,"score":1})

db.users.find({},{"name":0,"score":0})

조회시 1 1 끼리 0 0끼리 사용해야 한다. 혼용하면 오류 난다.

 

3.조건 설정

{필드이름:,...}

=>필드의 값이 값고 일치하는 데이터만 조회

=>여러 개의 조건을 나열하면 and입니다.

 

4)조건 연산자

$eq    : = 와 같은 기능으로 이 기능을 사용하지 않고 값을 직접 설정하는 형태를 사용

$ne    : <> != 같은 기능

$lt(lte): <(<=)

gt(gte): > (>=)

 

$in:배열에 속하는 경우

$nin:배열에 속하지 않는 경우

 

$not:반대로

$or: 또는

$and:그리고

$nor:not or

4개는 사용방법이 같다.

db.users.find( {$or: [ {name:"반바스텐"}, {password:89} ] })

 

users에서 score 90이 넘는 데이터만 조회

db.users.find({'score' :{$gt:90}})

 

users 에서 name이 굴리트 이거나 반바스텐인 데이터 조회

db.users.find({'name':{$in :['굴리트','반바스텐']}})

db.users.find({'name':{$nin :['굴리트','반바스텐']}})

 

5)like

=>정규식(Regular Expression - RegExp) 패턴을 사용

문자열에서 특정 패턴을 문자열을 조회하기 위해서 사용하는 문법

[0-9]

[-]

이메일은 정해진 단어가 아니다.

pattern을 뺄 경우 정규식 사용한다.

[A-Za-z]

 

users에서 name이 굴로 시작하는 데이터만 조회

db.users.find({'name':/.*/})

db.users.find({'name':/^/})

 

users에서 텐으로 끝나는 데이터만 조회

db.users.find({'name':/$/})

 

정규식:문자열에서 원하는 글자를 찾는 것이다.

여기 원래 정규식이였다.

 

6)findOne

=>1개만 조회

 

7)find().limit(개수)

 

8)find().skip(개수)

 

9)find().sort({필드이름:1 또는 -1,...})

=>1을 오름차순 정렬이고 -1을 설정하면 내림차순

 

10)limit,skip,sort는 조합할 수 있습니다.

db.users.find().skip(0).limit(1) // 여기 숫자는 chunk

db.users.find().skip(1).limit(1) // 몇개를 띄여쓰고 몇개를 찾을 가?

db.users.find().sort({"name":1}) //이름의 오름차순 정렬

chunk 는 분할 한다는 의미이다.

python에서는 chunk사용한다.

db.users.find().sort({"name":-1})

크기 비교할때 보통 3개 로 돌아온다.

 

11)cursor

=>여러 개의 데이터가 있을 때 하나씩 접근 할 수 있도록 해주는 포인터

=>다음 데이터 존재여부를 알려주는 메소드와 다음 데이터로 이동하는 메소드를 가지고 있습니다.

cursor는 첫번째 데이터를 가르키지 않는다.

그래서 첫번때 데이터를 읽으려면 next를 해야한다.

begin of file =>출발점 bof

데이터가 없는 끝나는 자리는 end of file(EOF)

자료구조에선느 BOF->HEAD

                  EOF->TAIL

다음 있냐 없냐는가 아니면 다음으로 넘어가는 것 등은 next이다.

 

데이터를 하나씩 접근

var cur = db.users.find()

 

데이터 존재 여부를 확인

cur.hasNext()

true false가 리턴

true가 리턴되면 다음 데이터가 잇는 것이고 false가 리턴되면 다음 데이터가 없는 경우

 

다음 데이터가 존재하는 경우 다음 데이터 확인

cur.next()

 

var cur = db.users.find()

cur.hasNext()

cur.next()

#프로그래밍에서 가져온다.

 

**Map – Reduce(맵 리듀스)

=>데이터의 모임에 집계를 적용한 후 연산을 수행해도록 하는 것

=>연산이나 집계 적용단위는 함수

 

1.샘플 데이터 생성 -CLASS별로 score의 합계를 구할려고 합니다.

db.map.insert({"name":"kim",score:76,"class":"A"})

db.map.insert({"name":"lee",score:85,"class":"B"})

db.map.insert({"name":"park",score:91,"class":"A"})

db.map.insert({"name":"choi",score:65,"class":"B"})

 

2.Map –Reduce Programming에서는 2개의 함수가 필요

집계를 위한 함수 그룹화할 함수

연산을 수행할 함수 연산 함수

 

#집계

var mapper = function(){

           emit(this.class, {score:this.score});

}

 

#연산

 

var reducer = function(key,values){

           var sum = 0;

           values.forEach(function(doc){

                       sum = sum + doc.score;

    });

    return {score:sum};

}

sum = sum + 1;=>개수가 된다.

#map-reduce 수행

db.map.mapReduce(mapper,reducer,{out:{inline:1}})

 

Hadoop            분산저장처리 기술

분산시스템은 각자 연산해서 한다.

**python mongo db연동

=>pymongo라는 패키지를 이용

1.pymongo패키지를 설치

cmd창에서 >pip install pymongo

python은 프로그램 수행도중에 설치 해도 괜찮다.

R은 다시 설치하면 restart된다.

 

2.mongo db연결

변수 = pymongo.MongoClient("ip주소","포트번호")

=>포트번호를 생략하면 27017

=>ip주소를 생략하면 로컬 컴퓨터

 

3.데이터베이스 설정

데이터베이스 변수 = 변수.데이터베이스이름

=>데이터베이스 이름이 없으면 새로 만들어 집니다.

 

4.컬렉션 설정

컬렉션변수 = 데이터베이스변수.컬렉션이름

=>컬렉션 이름이 없으면 새로 만들어 집니다.

 

5.실습

데이베이스 연결 및 컬렉션 연결

 

from pymongo import MongoClient

 

'''

데이터베이스 연결

'''

con = MongoClient()

#print(con)

 

'''

con 이 사용할 수 있는 속성과 메소드 확인

'''

#print(dir(con))

 

'''

데이터베이스 연결 및 생성

'''

db = con.mymongo

 

'''

컬렉션 연결 및 생성

'''

collection = db.sample

 

6.데이터 삽입

컬렉션.insert_one(dict 객체)

컬렉션.insert_many(list객체)

=>insert메소드가 있는데 deprecated

 

7.데이터 삽입 실습

dict1 = {"name":"kim","nation":"라이베리아"}

dict2 = {"name":"
요한","nation":"네덜란드"}
dict3 = {"name":"
에우","nation":"포르투칼"}
li = [dict2, dict3]

'''
데이터 삽입
'''
collection.insert_one(dict1)
collection.insert_many(li)

 

collection.insert(dict1)

C:/OracleConnect/mongoConnect.py:28: DeprecationWarning: insert is deprecated. Use insert_one or insert_many instead.

  collection.insert(dict1)

deprecated사용해도 되지만 없어질 수 있다.

 

8.데이터 조회

find_one(하나) find(여러개)함수를 이용

mongo db는 하나의 행을 dict로 만들어 줍니다.

 

분석 할려고 하면  자료형 무조건 확인 하는게 좋다.

'''
데이터 조회
'''
result = collection.find_one()
#print(type(result))
#<class 'dict'>
#dict
는 바로 출력해도 되고 dict['key']를 이용해서 부분적으로 사용
print(result)
print(result["name"])

result = collection.find()
#print(type(result))
#<class 'pymongo.cursor.Cursor'>
#
자료형이 class -> cursor
#
자료형이 모르는 클래스라서 사용 가능한 속성을 확인
#print(dir(result))
#iterator
여러개 데이터 순서대로 조회
#__iter__ 가 있으면 for - in 사용가능
#for i in []:
for i in result:
    print(i)

result = collection.find({"name":"
요한"})
for temp in result:
    print(temp)

 

result = collection.find({"name":"조지웨아"})

#print(type(result))

#자료형이 모르는 클래스라서 사용 가능한 속성을 확인

#__iter__ 가 있으면 for - in 사용 가능

#print(dir(result))

for temp in result:

    print(temp)

 

9.수정

update_one update_many

'''
데이터 수정
'''
#name
kim인 데이터의 nation을 모장비크로 변경
collection.update_one({"name":"kim"},{"$set":{"nation":"모장비크"}})
#update_many
다 바꿔진다.
result = collection.find()
for temp in result:
    print(temp)

 

 

 

10.삭제

delete_one() delete_many()

삭제하는 것은 경고하고 없에는 것이다.

'''
데이터 삭제
'''
collection.delete_one({"name":"kim"})
#update_many
다 바꿔진다.
result = collection.find()
for temp in result:
    print(temp)

 

 

java

gui프로그램

andriod

java network db연결

 

반응형

'Study > DB' 카테고리의 다른 글

DB-5  (0) 2020.09.17
DB-4  (0) 2020.09.15
DB-3  (0) 2020.09.15
DB-2  (0) 2020.09.13
DB-1  (0) 2020.09.13

+ Recent posts