[Database][실습] MongoDB, 아나콘다 설치, 실습

Dev_Honey·2022년 7월 18일
0

데이터베이스

목록 보기
2/7
post-thumbnail

실습 1

아나콘다 다운로드

  • 검색창에 이렇게 검색을 하고 Anaconda Distribution을 클릭
  • 최신버젼을 다운로드한다.




  • 이렇게 디폴트 값으로 다 설치를 해준다.
  • 완료!

Window

MongoDB 다운로드

  • mongodb download를 검색한다.
  • 현재 버젼을 다운로드한다.


  • complete를 클릭
  • 아래에서 데이터, 로그 디렉토리 변경원하면 바꾸고 아니면 그냥 그대로 두면 된다.
  • next를 누른다.
  • Next >>> Install

  • 설치를 완료했으니 이제 환경변수를 설정하자.

MongoDB 환경변수 설정

  • 클릭
  • 환경변수를 클릭한다.
  • 변수 Path를 편집 한다.
  • 새로만들기를 클릭하고, mongoDB디렉토리 경로를 넣어준다.
  • 다 하고 확인을 클릭 !

환경변수가 잘 설정되었는지 cmd를 통해 확인

  • 명령어로 mongo --version을 입력한다.
  • 그럼 이렇게 설치 된 것을 확인 할 수 있다.

실습 2

시나리오#1

1) mydb 내 emp 컬렉션 생성
2) 'emp' 컬렉션의 Document INSERT
3) 'emp'
4) 'emp'
5) 'emp'
6) 'emp'
(기타) export/import 명령문

시나리오#1 - 실행결과

  • CMD에서 mongo를 입력해서 mongodb를 실행시킨다.

  • show dbs를 입력하면 현재 dbs 볼 수 있다.
  • use mydb를 입력해서 mydb라는 데이터베이스를 생성한다.
  • show dbs해도 방금 생성한 데이터베이스는 보이지않는데,,, document를 넣어야 보인다.
db.createCollection("emp")를 입력해서 생성한다.

  • 이렇게 하면 mydb가 보인다.
  • show collections를 입력하면 현재 collection인 emp를 확인 할 수 있다.
  • db.emp.find()를 입력해서 collection 내부의 데이터를 읽어올 수 있는데 지금 데이터가 없어서 아무것도 없다.
1. 데이터 1건 입력
db.emp.insert({name:"KING",birthday:1981-05-01,hp:"010-1234-5678",status:"1"});

2. 데이터 다건 입력
db.emp.insertMany(
	[
	{name:"MARTIN",birthday:1971-04-11,hp:"010-4312-7856",status:"2"},
	{name:"ALLEN",birthday:1983-06-21,hp:"010-5678-1234",status:"1"},
	]
);

3. 데이터 1건 입력
db.emp.insert({name:"SCOTT",hp:"010-1212-3434",dept:"개발팀",status:"1"});

4. 데이터 조회
db.emp.find({status:"1"})
db.emp.find({status:"1"}, {name:1, hp:1})
db.emp.find({status:"1"}, {name:1, hp:1}).sort({name: 1})

5. 데이터 변경
db.emp.update( {status:"2"}, {$set: {status:"임시직"}} )
db.emp.update( {status:"1"}, {$set: {status:"정규직"}} )
db.emp.updateMany( {status:"1"}, {$set: {status:"정규직"}} )

db.emp.updateMany( {status:"정규직"}, {$set: {status:"1"}}, {multi:true} )
db.emp.update( {status:"1"}, {$set: {status:"정규직"}}, {multi:true} )
db.emp.update( {}, {$unset: {birthday:1}}, {multi:true} )

db.emp.updateMany( {}, {$set: {retire_yn:"N"}})

db.emp.find( { hp : /1234-5678/ } )
db.emp.find( { hp : { $regex: /1234-5678/ } } )

6. 데이터 삭제
db.emp.deleteMany( { hp : { $regex: /1234-5678/ } } )

[참고] 데이터 export
mongoexport -d mydb -c emp --type=csv -o emp.csv --port 27017
[참고] 데이터 import
mongoimport -d mydb -c emp_python --type csv --file emp.csv --headerline

7. 컬렉션 복제
show collections
db.emp.aggregate([{$out: "emp_python"}])
show collections

db.emp_python.count()
db.emp_python.find()
db.emp_python.insert({name:"PYTHON",hp:"010-1111-2222",status:"임시직", retire_yn:"Y"})
db.emp_python.find()

위 코드들을 shell에서 차례로 입력해서 실행시키고 그 결과를 보면

  • 데이터 하나를 넣고 데이터 조회를 해보면 위와 같이 나온다.
  • 다량의 데이터를 넣고 조회해보면 위와 같이 나온다.
  • 데이터 업데이트를 한 후 조회
  • 데이터 삭제, 컬렉션 복제 후 조회

시나리오#2-

1) 파이썬 DB 접속
2) 데이터 조회
3) 데이터 변경 - INSERT, UPDATE, DELETE
4) 컬렉션 변경
5) Index 관리

시나리오#2 - 실행결과

  • 아나콘다 프롬프트에서 주피터 노트북을 실행시킨다.

1.pymongo 라이브러리 import

pip install pymongo

2.mongodb 접속 (주소)

  • DB 정보 설정
  • 로컬에서 서버가 돌아갈 경우,
    • mongo
    • 예) pymongo.MongoClient()
  • 원격 서버에 접속할 경우
    • mongo --host 'host_address' --port 'port'
    • 예) mongo --host 192.10.21.3 --port 27017
      pymongo.MongoClient('mongodb://124.123.122.1:27017')
import pymongo
conn = pymongo.MongoClient('mongodb://localhost:27017')

3.database, collection 관리

  • 조회

    • show dbs
    • show collections
    • db.stats()
    • db.employees.stat()
    • db.employees.isCapped()
  • Create (생성)
    - use [DB 이름] : 데이터베이스 선택(없으면 생성)
    - db.createCollection("employees", {capped:true, size:10000})
    - capped:true 최초 제한된 크기로 생성된 공간에서만 데이터를 저장하는 설정
    (고성능, 저장공간차면 기존 공간 재사용, 일정시간만 저장하는 로그에 적합)

  • Alter (변경)
    • db.employees.renameCollection("emp") : 컬렉션명 변경
  • Drop (삭제)
    • db.employees.drop()

[SQL과 간단 비교 ]

  • collection 생성 (원하는 타임으로 데이터를 바로 넣으면 됨)
    • PRIMARY KEY를 위한 별도 컬럼 만들 필요 없음.
    • mongodb는 collection에서 _id가 각 Document마다 자동생성되어 primary key 역햘을 함
    • 컬럼마다 데이터 타입을 정할 필요 없음 ("컬럼명": 컬럼값 이 기본 형태임)
# mydb Database 생성/사용 및 객체 선언 
mydb = conn.mydb
# Collection 생성 및 객체 선언
emp_python = mydb.emp_python

4.데이터 변경
4.1 데이터 입력(Insert)

  • insertOne : 한개의 document 생성
  • insertMany : list of document 생성
# 1개 데이터 입력

#mydb_emp.insert_one( { "empid":"bcd001", "name" : "이정재", "age": 45, "teamname" : "인사부" } )

for i in emp_python.find():
  print(i)
>>>>
{'_id': ObjectId('62d504445d89d099122bf514'), 'name': 'MARTIN', 'hp': '010-4312-7856', 'status': '임시직', 'retire_yn': 'N'}
{'_id': ObjectId('62d504445d89d099122bf515'), 'name': 'ALLEN', 'hp': '010-5678-1234', 'status': '정규직', 'retire_yn': 'N'}
{'_id': ObjectId('62d504515d89d099122bf516'), 'name': 'SCOTT', 'hp': '010-1212-3434', 'dept': '개발팀', 'status': '정규직', 'retire_yn': 'N'}
{'_id': ObjectId('62d504515d89d099122bf517'), 'name': 'PYTHON', 'hp': '010-1111-2222', 'status': '임시직', 'retire_yn': 'Y'}
# 1개 이상의 데이터 입력

emp_python.insert_many(
    [
      { "empid":"bcd002", "name" : "진기주", "age":32, "teamname" : "배우팀" },
      { "empid":"bcd003", "name" : "고두심", "age":63, "teamname" : "배우팀" },
      { "empid":"bcd004", "name" : "박나래", "age":34, "teamname" : "개그맨팀" },
      { "empid":"cdc001", "name" : "전현무", "age":43, "teamname" : "아나운서팀" },
      { "empid":"cdc002", "name" : "화사", "age":29, "teamname" : "가수팀" }
    ]
)
for i in emp_python.find():
  print(i)
>>>>
{'_id': ObjectId('62d504445d89d099122bf514'), 'name': 'MARTIN', 'hp': '010-4312-7856', 'status': '임시직', 'retire_yn': 'N'}
{'_id': ObjectId('62d504445d89d099122bf515'), 'name': 'ALLEN', 'hp': '010-5678-1234', 'status': '정규직', 'retire_yn': 'N'}
{'_id': ObjectId('62d504515d89d099122bf516'), 'name': 'SCOTT', 'hp': '010-1212-3434', 'dept': '개발팀', 'status': '정규직', 'retire_yn': 'N'}
{'_id': ObjectId('62d504515d89d099122bf517'), 'name': 'PYTHON', 'hp': '010-1111-2222', 'status': '임시직', 'retire_yn': 'Y'}
{'_id': ObjectId('62d50d0152f70bf6ebcfaaa8'), 'empid': 'bcd002', 'name': '진기주', 'age': 32, 'teamname': '배우팀'}
{'_id': ObjectId('62d50d0152f70bf6ebcfaaa9'), 'empid': 'bcd003', 'name': '고두심', 'age': 63, 'teamname': '배우팀'}
{'_id': ObjectId('62d50d0152f70bf6ebcfaaaa'), 'empid': 'bcd004', 'name': '박나래', 'age': 34, 'teamname': '개그맨팀'}
{'_id': ObjectId('62d50d0152f70bf6ebcfaaab'), 'empid': 'cdc001', 'name': '전현무', 'age': 43, 'teamname': '아나운서팀'}
{'_id': ObjectId('62d50d0152f70bf6ebcfaaac'), 'empid': 'cdc002', 'name': '화사', 'age': 29, 'teamname': '가수팀'}
# 리스트 객체로 append 함수를 이용하여 데이터 입력
data = list()
data.append({'empid' : 'cdc007', "name" : "윤여정", "age":71, "teamname" : "가수팀"})
data.append({'empid' : 'cdc005', "name" : "한예리", "age":28, "teamname" : "배우팀"})
data.append({'empid' : 'ddd003', "name" : "서현", "age":27, "teamname" : ["가수팀", "배우팀"]})
data.append({'empid' : 'ddd002', "name" : "지현우"})

emp_python.insert_many(data)

for i in  emp_python.find():
  print(i)
>>>>
{'_id': ObjectId('62d504445d89d099122bf514'), 'name': 'MARTIN', 'hp': '010-4312-7856', 'status': '임시직', 'retire_yn': 'N'}
{'_id': ObjectId('62d504445d89d099122bf515'), 'name': 'ALLEN', 'hp': '010-5678-1234', 'status': '정규직', 'retire_yn': 'N'}
{'_id': ObjectId('62d504515d89d099122bf516'), 'name': 'SCOTT', 'hp': '010-1212-3434', 'dept': '개발팀', 'status': '정규직', 'retire_yn': 'N'}
{'_id': ObjectId('62d504515d89d099122bf517'), 'name': 'PYTHON', 'hp': '010-1111-2222', 'status': '임시직', 'retire_yn': 'Y'}
{'_id': ObjectId('62d50d0152f70bf6ebcfaaa8'), 'empid': 'bcd002', 'name': '진기주', 'age': 32, 'teamname': '배우팀'}
{'_id': ObjectId('62d50d0152f70bf6ebcfaaa9'), 'empid': 'bcd003', 'name': '고두심', 'age': 63, 'teamname': '배우팀'}
{'_id': ObjectId('62d50d0152f70bf6ebcfaaaa'), 'empid': 'bcd004', 'name': '박나래', 'age': 34, 'teamname': '개그맨팀'}
{'_id': ObjectId('62d50d0152f70bf6ebcfaaab'), 'empid': 'cdc001', 'name': '전현무', 'age': 43, 'teamname': '아나운서팀'}
{'_id': ObjectId('62d50d0152f70bf6ebcfaaac'), 'empid': 'cdc002', 'name': '화사', 'age': 29, 'teamname': '가수팀'}
{'_id': ObjectId('62d50d0252f70bf6ebcfaaad'), 'empid': 'cdc007', 'name': '윤여정', 'age': 71, 'teamname': '가수팀'}
{'_id': ObjectId('62d50d0252f70bf6ebcfaaae'), 'empid': 'cdc005', 'name': '한예리', 'age': 28, 'teamname': '배우팀'}
{'_id': ObjectId('62d50d0252f70bf6ebcfaaaf'), 'empid': 'ddd003', 'name': '서현', 'age': 27, 'teamname': ['가수팀', '배우팀']}
{'_id': ObjectId('62d50d0252f70bf6ebcfaab0'), 'empid': 'ddd002', 'name': '지현우'}

4.2 데이터 변경(Update/Modify)

  • updateOne - 매칭되는 한개의 document 업데이트

  • updateMany - 매칭되는 list of document 업데이트

  • db.people.updateMany( { age: { $gt: 25 } }, { $set: { status: "C" } } )

  • SQL 변환하면,

    • UPDATE people SET status = "C" WHERE age > 25
  • 한 Document만 수정하려면 updateOne을 사용함

  • db.people.updateOne( { age: { $gt: 25 } }, { $set: { status: "C" } } )

  • db.people.updateMany( { status: "A" } , { $inc: { age: 3 } } )

  • SQL 변환하면,

    • UPDATE people SET age = age + 3 WHERE status = "A"
for i in emp_python.find({"age" : {"$gt" : 40}}):
    print(i)
>>>>
{'_id': ObjectId('62d50d0152f70bf6ebcfaaa9'), 'empid': 'bcd003', 'name': '고두심', 'age': 63, 'teamname': '배우팀'}
{'_id': ObjectId('62d50d0152f70bf6ebcfaaab'), 'empid': 'cdc001', 'name': '전현무', 'age': 43, 'teamname': '아나운서팀'}
{'_id': ObjectId('62d50d0252f70bf6ebcfaaad'), 'empid': 'cdc007', 'name': '윤여정', 'age': 71, 'teamname': '가수팀'}
emp_python.update_many({"age" : {"$gt" : 40}},{"$inc": {"age":3}})
>>>>
<pymongo.results.UpdateResult at 0x12635044760>
for i in emp_python.find({"age": {"$gt" : 40}}):
    print(i)
>>>>
{'_id': ObjectId('62d50d0152f70bf6ebcfaaa9'), 'empid': 'bcd003', 'name': '고두심', 'age': 66, 'teamname': '배우팀'}
{'_id': ObjectId('62d50d0152f70bf6ebcfaaab'), 'empid': 'cdc001', 'name': '전현무', 'age': 46, 'teamname': '아나운서팀'}
{'_id': ObjectId('62d50d0252f70bf6ebcfaaad'), 'empid': 'cdc007', 'name': '윤여정', 'age': 74, 'teamname': '가수팀'}

4.3 데이터 삭제(Delete)

  • removeOne - 매칭되는 한개의 document 삭제

  • removeMany - 매칭되는 list of document 삭제

    db.people.deleteMany( { status: "D" } )
    SQL로 변환하면,
    DELETE FROM people WHERE status = "D"
    db.people.deleteMany({})
    SQL로 변환하면,
    DELETE FROM people

emp_python.delete_many({"name":"전현무"})
>>>>
<pymongo.results.DeleteResult at 0x126361fc4f0>

5.데이터 조회

result = emp_python.find({}, {"_id" : 0}).limit(4)
for r in result:
  print(r)
>>>>
{'name': 'MARTIN', 'hp': '010-4312-7856', 'status': '임시직', 'retire_yn': 'N'}
{'name': 'ALLEN', 'hp': '010-5678-1234', 'status': '정규직', 'retire_yn': 'N'}
{'name': 'SCOTT', 'hp': '010-1212-3434', 'dept': '개발팀', 'status': '정규직', 'retire_yn': 'N'}
{'name': 'PYTHON', 'hp': '010-1111-2222', 'status': '임시직', 'retire_yn': 'Y'}

6.Index 관리

emp_python.create_index([('name', pymongo.TEXT), ('hp', pymongo.ASCENDING)])
>>>>
'name_text_hp_1'
emp_python.index_information()
>>>>
{'_id_': {'v': 2, 'key': [('_id', 1)]},
 'name_text_hp_1': {'v': 2,
  'key': [('_fts', 'text'), ('_ftsx', 1), ('hp', 1)],
  'weights': SON([('name', 1)]),
  'default_language': 'english',
  'language_override': 'language',
  'textIndexVersion': 3}}
# 띄어쓰기가 있는 경우
result = emp_python.find({'$text' : {'$search' : '박나래 ALLEN'}})
for record in result :
    print(record)
>>>>
{'_id': ObjectId('62d504445d89d099122bf515'), 'name': 'ALLEN', 'hp': '010-5678-1234', 'status': '정규직', 'retire_yn': 'N'}
{'_id': ObjectId('62d50d0152f70bf6ebcfaaaa'), 'empid': 'bcd004', 'name': '박나래', 'age': 34, 'teamname': '개그맨팀'}
  • 총평 : MongoDB를 써보니 UI도 잘되어있는 것 같다. query가 아직 익숙하지가 않아서 CRUD하는 것이 조금 버벅이긴 하지만, 익숙해진다면 잘 사용할 것으로 보인다.

Mac

MongoDB 다운로드

1. MongoDB를 설치하기 위해서는 먼저 Homebrew를 설치해야 한다.

https://brew.sh/index_ko
들어가서
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
를 복사해서

2. 터미널에 그대로 붙여 넣는다.

그런데 그냥 설치하게되면 /opt/homebrew/bin에 설치가 되어서 환경변수를
추가 해줘야 한다.
export PATH=$PATH:/opt/homebrew/bin을 입력해주고나면
brew 명령어가 먹힐 것이다.
위 환경변수 설정은 1회용이므로, 영구적으로 환경변수 설정을 하려면
vi ~/.zshrc 를 터미널에 입력해서 vi 편집기로 열고

export PATH=$PATH:/opt/homebrew/bin

를 그대로 입력한 후 : 누르고 wq!를 입력한 후 저장 종료를 한다.
이제 brew 명령어가 먹힐 것이다.

3. MongoDB 설치

  • brew tap mongodb/brew 를 입력해서 탭에 추가

  • brew install mongodb-community@5.0
    를 터미널에 입력

  • brew tap 을 입력해서 tap 확인 !

  • brew install mongodb-coummunity를 입력해서 설치

  • brew services start mongodb-community@5.0 로 mongodb 실행

  • brew services list 로 실행이 되고 있는지 확인 !

  • brew services stop mongodb-community@5.0 실행 중지 명령어 !

다음은 https://velog.io/@fcfargo/TIL-MongoDB-Mongoose
에서 발췌한 실행해서 사용하는 방법이다. 감사합니다.

4. MongoDB 실행

  • MonogDB 계정 생성(root 계정)
    MonogDB 계정 생성(root 계정)
    mongo shell에 들어오면 가장 먼저 MongoDB 계정을 생성해야 한다. 생성할 계정은 크게 두 가지다. 하나는 모든 권한을 지닌 root 계정이고, 다른 하나는 생성된 데이터베이스를 읽고 쓰는 권한을 가진 일반 사용자 계정이다. 우선 root 계정을 생성토록 하자.
    use admin: admin 데이터베이스를 사용
    db.createUser( { user: "mongo", pwd: "password123", roles: ["root"] }): 사용 중인 데이터베이스에 root 계정 추가
    root 계정으로 mongo shell 접속하기
    mongo admin -u 아이디 -p 비번: root 계정으로 shell에 접속
    MonogDB 계정 생성(일반 사용자)
    use db 이름: db 생성 및 사용
    show dbs: 현재 생성된 db 목록 확인
    db; 현재 사용 중인 db 확인
    db.createUser({ user: "youruser", pwd: "yourpassword", roles: [{ role: "dbOwner", db: "사용 중인 db 이름" }] }): 현재 사용 중인 db를 읽고 쓸 수 있는 일반 사용자 계정 생성
    주의 사항: 생성된 계정은 현재 사용 중인 데이터베이스에 대해서만 권한을 갖기 때문에, 계정 생성 전 db;명령으로 현재 사용 중인 데이터베이스가 무엇인지 확인하는 게 좋다.
    c.f)db.dropUser("username"): 계정 삭제 명령
    c.f)db.getUsers(): 현재 데이터베이스의 사용자 출력
    MongoDB 인증 기능 추가 및 외부 접속 허용하기
    별도의 보안 인증 절차 없이 MongoDB 실행이 가능하다. 문제는 이러한 보안 절차를 생략하게 되면 랜섬웨어 등의 공격에 취약할 수 있다는 점이다. 그러므로 MongoDB를 처음 시작하는 사용자라면 신뢰도 있는 사용자에게만 Server 접속을 허용토록 인증 절차를 추가하는 걸 권장한다. 방법은 아래와 같다.
    mongodb.conf 파일 접근
    vim /opt/homebrew/etc/mongod.conf: mongodb.conf 파일에 접근하자. Apple M1 Mac 사용자가 아니라면, /usr/local/etc/mongod.conf 경로에서 찾을 수 있다.
    보안 인증 절차 추가
    다음 코드를 추가
    security:
    authorization: 'enabled'
    외부 접속 허용 및 포트 번호 설정
    기존의 bindIp: 127.0.0.1를 다음 코드로 변경
    net:
    port: 27017
    bindIp: 0.0.0.0
    brew services restart mongodb-community@5.0 MongoDB 재활성화
    netstat -anv|grep LISTEN: MongoDB 실행 여부 확인
    mongo db이름 -u 아이디 -p 비밀번호: MongoDB 접속
    ex) mongo subway -u root -p 12341234
    MongoDB Collection 생성 및 Compass 설치
    db.createCollection(name,[options]): Collection 생성
    ex) db.createCollection("subway_stations")
    Collection 삭제 명령: db.Collection 이름.drop()
    Compass 다운로드 사이트

Compass란?
terminal 환경에서 MongoDB를 사용할 때 겪는 불편함을 덜어줄 수 있는 MongoDB GUI tool이다. Compass를 활용하면 DB Collection 조회, 추가, 삭제부터 Document의 CRUD에 이르기까지 보다 쉬운 데이터베이스 관리가 가능해진다.

여기서부턴 Compass나 mongo shell을 이용하여 사용자의 입맛에 맞게 document(RDBMS의 데이터 row에 해당)를 추가하는 등의 DB 구축을 해 나가면 된다!!!

5. Mac에 MongoDB-Compass 설치

  • mongodb compass 어플리케이션을 열면 된다.

만약, [Trouble Shooting] 오류가 뜨시는 분은 다음 url로 들어가셔서 참조 하시면 되겠습니다.
https://soyoung-new-challenge.tistory.com/95

아랫단에 오류 내용 있습니다.


참고자료

https://choboit.tistory.com/95
https://soyoung-new-challenge.tistory.com/95

profile
자습서 같은 공부 블로그 만들기!

0개의 댓글