본문 바로가기
LG 헬로비전 DX DATA SCHOOL/DATA BASE

Mongo DB

by 황밤 2023. 7. 24.
728x90
반응형

2023/07/24

 

Mongo DB

SMALL

Docker 에서 Mongo DB 컨테이너 실행

이전에 설치한 경우 Docker Desktop에서 만들어진 Container를 실행

설치가 안된 경우 docker run -- name 컨테이너이름(mango) -v ~/data:/data/db -d(백그라운드를 의미) 0p 27017:27017 mongo(이미지 이름)

 

출처 : 송민호 같은 송준호

CQRS 
- 읽기 -> No SQL (빠른 속도)
- 조작 -> 관계형 DB(안정성)

SHELL : 명령어 interface
실행가능 파일은 전부 bin에 있음(바이너리 파일)

Mongo DB 접속
터미널에서 Mongodb bash 셀 접속 : docker exec -it 컨테이너 이름 bash

Mongo DB 접속을 위한 프로그램이 있는 곳으로 경로를 이동 : cd bin 

접속 프로그램 실행 : mongosh(예전에는 mongo) IP : 포트번호
IP 생략시 localhost:27017로 접속함.

Mongo DB 작업
Database > Collection(RDBMS 에서는 Table)

데이터베이스 확인 및 접속(없으면 생성)
show dbs : 데이터 베이스 확인

use 데이터 베이스 이름 : 없으면 생성, 데이터가 없으면 확인은 안됨.

컬렉션 생성 : 데이터를 삽입할 때 컬렉션이 존재하지 않으면 자동 생성

1. 데이터 삽입

1.1) 삽입함수

 

db.컬렉션이름.insert(객체) : 예전 API

db.컬렉션이름.save(객체) :

 

db.컬렉션이름.insertOne(객체) 

db.컬렉션이름.insertMany(객체) 

  • Mongo DB는 _id 라는 기본키 컬럼을 기본적으로 제공하는데 자료형은 Object_id
  • save는 동일한_id 값을 제공하면 수정을 하고 나머지 함수들은 예외를 발생시킴
  • 삽입할 때 배열을 대입하면 분할해서 수행 - Mongo DB는 최상위 레벨에 배열을 지원하지 않음.
  • 데이터 확인 : db.컬렉션 이름.find()
  • 데이터 삽입 및 확인
db.users.insertOne({name:"svng", age:26, gender:"man"})
db.users.insert([{name:"svng", age:26, gender:"man"}, {name:"jenny", age:23, gender:"woman"}])

db.users.find()

 

 

(Schema, Table)Class(Python) = RDBMS

dict(map) = NoSQL

 

 

  • Insert 함수의 2번째 매개변수는 생략이 가능한데 ordered 라는 옵션을 이용해서 싱글 스레드를 사용할 지 멀테 스레드를 이용할 지를 결정할 수 있습니다.

insert를 할 때 배열을 대입한 경우 싱글 스레드로 작업하면 중간에 오류가 발생하면 작업을 더 이상 진행 할 수 없지만 멀티 스레드로 작업하면 중간에 오류가 발생해도 다른 작업은 계속 수행됨.

  • 프로그램의 실행 단위

Process : 가장 큰 실행 단위로 실행 중인 프로그램을 의미하는데 실행 중간에 다른 프로세스를 수행할 수 없고 데이터 공유가 안됨. 

 

Thread : Process 안에서 독립적으로 동작하는 작업 단위로 실행 중간에 다른 스레드의 작업을 수행할 수 있지만 데이터 공유는 통신을 이용하거나 공유 메모리를 사용해야 함.

 

Coroutine(Goroutine) : Thread 보다는 가볍고 서로 간에 공유 메모리(Channel)를 이용해서 통신도 할 수 있는 경량의 스레드와 유사한 작업 단위 - 이것을 이용하면 구독과 게시 시스템이나 병렬 처리를 구현하는 것이 쉬워짐. 

 

구독과 게시를 이용해서 공장 자동화나 CQRS 구현을 할 수 있다.

 

멀티 스레드를 이용해서 배열을 삽입하는 경우의 차이

컬렉션에 고유 인덱스(RDBMS의 unique 설정)를 설정

> db.컬렉션 이름.createindex({컬럼이름:정렬조건}, {unique:true})

> db.sample.insert({name:"park"})

 

> 배열을 삽입

db.sample.insert([{name:"kim"}, {name:"park"}, {name:"lee"}])

 

> 데이터 확인 - lee 는 삽입이 안된 상태

db.sample.find()

>배열을 삽입

db.sample.insert([{name:"lee"}, {name:"park"}, {name:"choi"}],{ordered:false})

 

>데이터 확인 - 중간에에러가 발생했지만, 멀티스레드를 이용해서 삽입하므로 choi가 삽입이 된다.

db.sample.find() 

svng> db.hihi.createindex({name:1}, {unique:true})
TypeError: db.hihi.createindex is not a function
svng> db.sample.createIndex({name:1}, {unique:true})
name_1
svng> db.sample.insert({name:"park"})
{
  acknowledged: true,
  insertedIds: { '0': ObjectId("64bdd582d59f8cd9e4135ef7") }
}
svng> db.sample.insert({name:"park"})
Uncaught:
MongoBulkWriteError: E11000 duplicate key error collection: svng.sample index: name_1 dup key: { name: "park" }
Result: BulkWriteResult {
  insertedCount: 0,
  matchedCount: 0,
  modifiedCount: 0,
  deletedCount: 0,
  upsertedCount: 0,
  upsertedIds: {},
  insertedIds: { '0': ObjectId("64bdd5bad59f8cd9e4135ef8") }
}
Write Errors: [
  WriteError {
    err: {
      index: 0,
      code: 11000,
      errmsg: 'E11000 duplicate key error collection: svng.sample index: name_1 dup key: { name: "park" }',
      errInfo: undefined,
      op: { name: 'park', _id: ObjectId("64bdd5bad59f8cd9e4135ef8") }
    }
  }
]
svng> db.sample.insert([{name:"kim"}, {name:"park"}, {name:"lee"}])
Uncaught:
MongoBulkWriteError: E11000 duplicate key error collection: svng.sample index: name_1 dup key: { name: "park" }
Result: BulkWriteResult {
  insertedCount: 1,
  matchedCount: 0,
  modifiedCount: 0,
  deletedCount: 0,
  upsertedCount: 0,
  upsertedIds: {},
  insertedIds: {
    '0': ObjectId("64bdd5bcd59f8cd9e4135ef9"),
    '1': ObjectId("64bdd5bcd59f8cd9e4135efa"),
    '2': ObjectId("64bdd5bcd59f8cd9e4135efb")
  }
}
Write Errors: [
  WriteError {
    err: {
      index: 1,
      code: 11000,
      errmsg: 'E11000 duplicate key error collection: svng.sample index: name_1 dup key: { name: "park" }',
      errInfo: undefined,
      op: { name: 'park', _id: ObjectId("64bdd5bcd59f8cd9e4135efa") }
    }
  }
]
svng> db.sample.insert([{name:"kim"}, {name:"lee"}])
Uncaught:
MongoBulkWriteError: E11000 duplicate key error collection: svng.sample index: name_1 dup key: { name: "kim" }
Result: BulkWriteResult {
  insertedCount: 0,
  matchedCount: 0,
  modifiedCount: 0,
  deletedCount: 0,
  upsertedCount: 0,
  upsertedIds: {},
  insertedIds: {
    '0': ObjectId("64bdd5c8d59f8cd9e4135efc"),
    '1': ObjectId("64bdd5c8d59f8cd9e4135efd")
  }
}
Write Errors: [
  WriteError {
    err: {
      index: 0,
      code: 11000,
      errmsg: 'E11000 duplicate key error collection: svng.sample index: name_1 dup key: { name: "kim" }',
      errInfo: undefined,
      op: { name: 'kim', _id: ObjectId("64bdd5c8d59f8cd9e4135efc") }
    }
  }
]
svng> db.sample.find()
[
  { _id: ObjectId("64bdd582d59f8cd9e4135ef7"), name: 'park' },
  { _id: ObjectId("64bdd5bcd59f8cd9e4135ef9"), name: 'kim' }
]
svng> db.sample.insert([{name:"lee"}, {name:"park"}, {name:"choi"}],{ordered:false})
Uncaught:
MongoBulkWriteError: E11000 duplicate key error collection: svng.sample index: name_1 dup key: { name: "park" }
Result: BulkWriteResult {
  insertedCount: 2,
  matchedCount: 0,
  modifiedCount: 0,
  deletedCount: 0,
  upsertedCount: 0,
  upsertedIds: {},
  insertedIds: {
    '0': ObjectId("64bdd6bfd59f8cd9e4135efe"),
    '1': ObjectId("64bdd6bfd59f8cd9e4135eff"),
    '2': ObjectId("64bdd6bfd59f8cd9e4135f00")
  }
}
Write Errors: [
  WriteError {
    err: {
      index: 1,
      code: 11000,
      errmsg: 'E11000 duplicate key error collection: svng.sample index: name_1 dup key: { name: "park" }',
      errInfo: undefined,
      op: { name: 'park', _id: ObjectId("64bdd6bfd59f8cd9e4135eff") }
    }
  }
]
svng> db.sample.find()
[
  { _id: ObjectId("64bdd582d59f8cd9e4135ef7"), name: 'park' },
  { _id: ObjectId("64bdd5bcd59f8cd9e4135ef9"), name: 'kim' },
  { _id: ObjectId("64bdd6bfd59f8cd9e4135efe"), name: 'lee' },
  { _id: ObjectId("64bdd6bfd59f8cd9e4135f00"), name: 'choi' }
]

- kim, lee, park, choi 모두 들어감을 확인 가능

프로세스 스레드 코루틘 채널

 

insertOne : 데이터 1개 삽입을 위한 새로 만들어진 API

2개의 매개변수를 가지고 있고 삽입된 데이터의 ObjectId를 리턴

첫번째 매개변수는 삽입할 데이터이고 두번째 매개변수는 옵션으로 wirteConcern을 설정

WriteConcern 은 데이터를 삽입할 때 안정성을 위한 옵션

Mongo DB는 느슨한 트랜잭션을 사용하는데 데이터를 삽입할 때 메모리에 데이터를 삽입하고 작업이 많지 않은 시간에 실제 데이터베이스로 복사를 한다.

 

비정상적으로 종료가 되면 Mongo DB에서는 데이터가 제대로 삽입되지 않을 수 있습니다.

이러한 부분을 제어하기 위한 옵션이 wirteConcern 

데이터가 정상적으로 원본에 삽입이 이루어질 때 까지 Client 에게 데이터를 읽지 못하도록 하는 옵션

 

여러 개 데이터 삽입 : insertMany

insertOne에 비해서 ordered 옵션이 추가

 

자바스크립트의 반복문 사용 가능

var num=1 

for(var i=0; i<3; i++){db.sample.insertOne({name:"user"+i, score : num})

 

 

2. 데이터 조회

2.1) 특징

 

  • 단일 도큐먼트에서만 조회
  • join이 없음
  • 여러 개의 테이블 사이의 관계를 만들 때는 Linking 이나 Embedding을 이용

RDBMS 는 배열이 없다.

 

어떤 일을 한다고 하면 큰 공부통이 있는 것도 좋지만, 작업별로 여로개로 나누어 관리하는 것이 더 편리하다.

 

2.2)조회 함수 => find()

=> db.컬렉션이름.find() : 컬렉션의 전체 데이터 조회

=> 매개변수는 2개

quety, 조회할 필드이름

리턴은 cursor를 리턴

 

2.3) 샘플 데이터 삽입

: 외부에서 만든 json 파일을 이용해서 도커에서 샘플 데이터를 생성하기

터미널로 이동

도커의 컨테이너에 파일을 복사하는 명령 : 환경 설정에서 주로 이

docker cp 파일경로 컨테이너이름:/복사할 디렉토리/파일명

 

mongodb 컨테이너의 tmp 디렉토리에 area.json, month.json, by_month.json, by_road_type.json, primer.json

 

 

C:\Users\USER>docker cp C:\Users\USER\Downloads\area.json mango:/tmp/area.json
Successfully copied 27.6kB to mango:/tmp/aread.json

C:\Users\USER>docker cp C:\Users\USER\Downloads\by_month.json mango:/tmp/month.json
Successfully copied 407kB to mango:/tmp/month.json
C:\Users\USER>docker cp C:\Users\USER\Downloads\by_type.json mango:/tmp/type.json
Successfully copied 195kB to mango:/tmp/type.json

C:\Users\USER>docker cp C:\Users\USER\Downloads\primer.json mango:/tmp/type.json
Successfully copied 3.07kB to mango:/tmp/type.json

C:\Users\USER>docker cp C:\Users\USER\Downloads\by_road_type.json mango:/tmp/road.json
Successfully copied 279kB to mango:/tmp/road.json

C:\Users\USER>docker cp C:\Users\USER\Downloads\primer.json mango:/tmp/primer.json
Successfully copied 3.07kB to mango:/tmp/primer.json

C:\Users\USER>docker cp C:\Users\USER\Downloads\by_type.json mango:/tmp/type.json
Successfully copied 195kB to mango:/tmp/type.json

json 파일에서 데이터 읽기 : mongo shell 에서 수행

mongoimport -d 데이터베이스이름 -c 컬렉션이름 < 파일경로

 

mongoimport -d svng -c area < /tmp/aread.json

mongoimport -d svng -c by_month < /tmp/by_month.json

mongoimport -d svng -c primer < /tmp/primer.json

mongoimport -d svng -c by_type < /tmp/type.json

mongoimport -d svng -c by_road_type < /tmp/road.json

 

샘플데이터 확인 mongosh(cd bin -> mongosh)에서 수행

 

use svng

db.area.find()

 

2.4) 일치하는 데이터 조회

db.컬렉션이름.find({속성이름:값, 속성이름:값...})

속성이름 여러 개 나열하면 and 조건

 

  • users 컬렉션에서 name이 adma 조회

db.users.find({name:"adam"})

 

  • inventory 컬렉션에서 category가 clothing 인 데이터 조회

db.inventory.find({category:"clothing"})

 

  • 샘플 데이터 삽입
db.containerBox.insertMany([

                {name:'bear',weight:60,category:'animal'},

                {name:'bear',weight:10,category:'animal'},

                {name:'cat',weight:5,category:'animal'},

                {name:'phone',weight:1,category:'ele'},

])

 

  • 데이터 조회
db.containerBox.find({category:'animal'})

db.containerBox.find({name:'bear'})



카테고리가 애니멀 and name이 bear 인 데이터

db.containerBox.find({category:"animal",name:'bear'})

 

 

2.5) 특정 속성(컬럼)만 추출

 

db.컬렉션이름.find({조건}, {컬럼이름:true 나 false, 컬럼이름:true 나 false...})

  • true를 설정하면 조회가 되고 false를 설정하면 조회되지 않습니다.
  • 1 과 0을 설정해도 됩니다.
  • containerBox에서 _id 와 name만 조회

db.containerBox.find({}, {_id:true, name:1})

  • containerBox에서 name만 제외후 조회

db.containerBox.find({}, {_id:true, name:0})

 

 

2.6) 비교 연산자

  •  $eq : 같다
  •  $ne : 같지않다
  •  $gt : 크다
  •  $gte : 크거나 같다
  •  $lt : 작다
  •  $lte : 작거나 같다
  •  $in : 배열의 요소 중 하나
  •  $nin : 배열의 요소가 아닌
  •  사용방법

{컬럼이름:{연산자:값, 연산자:값...}}

  •  배열의 경우는표현식 사용 가능
  • inventory 컬렉션에서 item 컬럼의 값이 hello 인 경우 조회
db.inventory.find({item:{$eq:'hello'}})

db.inventory.find({item:'hello'})

-> 둘다 동일
  • inventory 컬렉션에서 tags 컬럼의 값이 blank 나 blue 인 경우 조회

db.inventory.find({tags:{$in : ['blank', 'blue']}})

  • inventory 컬렉션에서 tags 컬럼의 값이 blank 나 blue 가 아닌 경우 조회

db.inventory.find({tags:{$nin : ['blank', 'blue']}})

  • 배열에 정규식 사용이 가능
#영문 소문자로 시작하고 la로 끝나는 문자열

db.inventory.find({tags:{$in : [/^[a-z]^la/]}})



#영문 소문자 b로 시작하지 않는 문자열

db.inventory.find({tags:{$nin : [/^b/]}})

 

2.7) 논리 결합 연산자

  • $not
  • $or
  • $and 
  • $nor : 주어진 조건 중 하나라도 만족하지 않는 데이터 조회
  • inventory 컬렉션에서 qty가 2보다 크지 않은 데이터 조회

db.inventory.find({qty:{$not:{$gt:2}}})

db.inventory.find({qty:{$lte:2}}})

 

inventory 컬렉션에서 qty가 100보다 크거나 qty가 10보다 작은 데이터 조회

db.inventory.find({$or:[{qty:{$gt:100}}, {qty:{$lt:10}}]})

 

 

 

2.8) 문자열 조회

 

  • $regex : 정규 표현식으로 조회
  • $text : 문자열 검색
db.users.insert({name:'paulo'})

db.users.insert({name:'patric'})

db.users.insert({name:'pedro'})

#데이터 입력

 

 

 

  • r 이 포함된 문자열 검색

db.users.find({name:/r/})

svng> db.users.find({name:/r/})
[
  { _id: ObjectId("64be0dc71aba0d2b634647bb"), name: 'pedro' },
  { _id: ObjectId("64be0dcd1aba0d2b634647bc"), name: 'patric' }
]

 

 

 

  • pa로 시작하는 문자열 검색

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

db.users.find({name:/^pa/})
[
  { _id: ObjectId("64be0db21aba0d2b634647ba"), name: 'paulo' },
  { _id: ObjectId("64be0dcd1aba0d2b634647bc"), name: 'patric' }
]

 

 

 

 

  • ro로 끝나는 문자열 검색

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

svng> db.users.find({name:/ro$/})
[ { _id: ObjectId("64be0dc71aba0d2b634647bb"), name: 'pedro' } ]

 

2.9) 배열 연산자

 

  • NoSQL 들은 객체 안에 배열을 저장할 수 있습니다.

객체 안에 존재하는 배열을 이용한 조회를 할 수 있습니다.

  • $all : 순서와 상관없이 배열 안의 모든 요소가 포함되면 조회
  • $elemMatch: 조건과 맞는 배열 속 요소를 선택
  • $size : 해당 배열의 크기가 같은 Document 선택

 

 

  • 샘플 데이터 입력
db.inventory.insertMany([
 { item: "journal", qty: 25, tags: ["blank", "red"] },
 { item: "notebook", qty: 50, tags: ["red", "blank"] },
 { item: "paper", qty: 100, tags:[]},
 { item: "planner", qty: 75, tags: ["blank", "red"] },
 { item: "postcard", qty: 45, tags: ["blue"] }
]);

in or => [], 그 이외의 조건은 {}

 

  • inventory 에서 tags 에 red 가 포함된 데이터 조회

db.inventory.find({tags:"red"})

 

  • 조건에  or, in 또는 nin 없이 배열을 사용하면 순서도 일치해야 합니다.

db.inventory.find({tags:["red", "blank"]})

 

  • red 나 blank 를 포함하는데, 순서는 상관 없는 경우

db.inventory.find({$or:[{tags:"red"}, {tags:"blank"}]})

 

 

  • 특정 인덱스의 데이터 조회

{$slice : 인덱스} : 인덱스 번째 데이터를 조회

 

{$slice :[시작위치, 종료위치]} : 시작 위치부터 종료 위치 데이터까지 조회

 

{$slice : 음수} : 뒤에서 음수 개수 만큼 조회

 

db.inventory.find({},{tags:{slice:1}})

db.inventory.find({},{tags:{slice:-2}})

db.inventory.find({},{tags:{slice:[1,3]}})

 

  • 샘플 데이터 삽입

 

db.users.insert({name:"matt", scores:[79, 85, 93]})

db.users.insert({name:"lara", scores:[91, 74, 63]})

 

  • score 의 모든 값이 80 보다 크고 90 보다 작은 데이터 조회

db.users.find({score:{$gt:80, $lt:90}})

 

  • score 의 값이 하나라도 80 보다 크고 90 보다 작은 데이터 조회

db.users.find({scores:{$elemMatch:{$gt:80, $lt:90}}})

svng> db.users.find({scores:{$elemMatch:{$gt:80, $lt:90}}})
[
  {
    _id: ObjectId("64be16821aba0d2b634647c2"),
    name: 'matt',
    scores: [ 79, 85, 93 ]
  }
]

 

  • 배열을 all 과 함께 기재하면 데이터의 순서에 상관없이 포함하고 있으면 조회
  1. db.inventory.find({tags:{$all:['red', 'blank']}}) //순서 상관 없이 데이터만 포함

 

   2. db.inventory.find({tags:{['red', 'blank']}) // 순서와 데이터 개수까지 일치해야 함.

 

 

 

  • tags 항목에 데이터를 가지고 있지 않으면 조회

db.inventory.find({tags:{$size:0}})

 

svng> db.inventory.find({tags:{$size:0}}) // 사이즈가 0
[
  {
    _id: ObjectId("64be0fe31aba0d2b634647bf"),
    item: 'paper',
    qty: 100,
    tags: []
  }
]
svng> db.inventory.find({tags:{$size:1}}) // 사이즈가 1
[
  {
    _id: ObjectId("64be0fe31aba0d2b634647c1"),
    item: 'postcard',
    qty: 45,
    tags: [ 'blue' ]
  }
]

 

 

$exists 연산자는 RDBMS 는 가지고 있지 않다.

  • $exists 연산자에 true 나 false를 설정해서 컬럼의 존재 여부를 조회할 수 있습니다.

NoSQL 들은 하나의 컬렉션에 존재하는 데이터의 모양이 다를 수 있습니다.

각 객체가 가지고 있는 컬럼이 다를 수 있습니다.

 

데이터 개수 제한은 limit 함수

 

offset 위치 변경은 skip 함수

 

데이터 1개 조회는 find 대신에 findOne 함수 : unique 한 속성을 가지고 데이터를 조회할 때 사용

 

정렬은 sort 함수

컬럼 이름 과 1또는 -1을 설정

1을 설정 -> 오름 차순, -1 -> 내림차순

 

db.inventory.find().skip(2).limit(2)

 

 

 

 

2.10) cursor

 

  • MongoDB 는 조회 성능을 높이기 위해서 find 함수의 결과로 cursor를 리턴
  • cursor는 쿼리 결과를 가리키는 포인터입니다.
  • 관계형 데이터베이스는 쿼리의 결과로 실제 데이터를 리턴합니다.

cursor를 이용하는 것보다 비효율적인 경우가 발생할 수 있습니다.

  • cursor의 메소드로는 데이터의 존재 여부를 리턴하는 hasNext(), 데이터가 존재하는 경우 다음 데이터를 리턴하는 next가 있습니다.
var cursor = db.inventory.find() // 변수로 선언

cursor.hasNext() // 다음 데이터 유무 확인

cursor.next() // 다음 데이터 확인

cursor.hasNext() ? cursor.next() : null // null이 아닌 데이터 확인

 

cursor 와 유사한 형태가 프로그래밍에서는 iterator(반복자) 또는 enumerator 이고 이를 쉽게 사용할 수 있도록 만든 제어문이 python의 for(cursor) 이다.

for 변수 in (__iter__가 구현된 모임) :

파이썬은 key가 return 

 


 

3. 데이터 집계

 : 데이터를 가지고 그룹화를 하거나 연산을 수행하는 것

 

 

3.1) 구현 방법

 

            애플리케이션을 이용해서 집계(자유도 높음)                맵 - 리듀스(높은 편)                   데이터베이스 파이프(나쁨)

자유도                         높음                                                                높은편                                            나쁨

처리                             나쁨                                                                 보통                                          가장 좋음

램 사용량                 매우 높음                                                             높음                                             낮음

처리 위치               애플리케이션                                               자바스크립트 엔진                          Mongo DB 내부

 

  

3.2) 샘플 데이터 입력

db.products.insert({'name':'iPad 16GB Wifi', 'manufacture':"Apple",

                    'category':'Tablets', 'price':499.00})

db.products.insert({'name':'iPad 32GB Wifi', 'category':'Tablets',

                    'manufacture':"Apple", 'price':599.00})

db.products.insert({'name':'iPad 64GB Wifi', 'category':'Tablets',

                    'manufacture':"Apple",  'price':699.00})

db.products.insert({'name':'Galaxy S3', 'category':'Cell Phones',

                    'manufacture':'Samsung', 'price':563.99})

db.products.insert({'name':'Galaxy Tab 10', 'category':'Tablets',

                    'manufacture':'Samsung', 'price':450.99})

db.products.insert({'name':'Vaio', 'category':'Laptops',

                    'manufacture':"Sony", 'price':499.00})

db.products.insert({'name':'Macbook Air 13inch', 'category':'Laptops',

                    'manufacture':"Apple", 'price':499.00})
                    
db.products.insert({'name':'Nexus 7', 'category':'Tablets',
                    'manufacture':"Google", 'price':199.00})
                    
db.products.insert({'name':'Kindle Paper White', 'category':'Tablets',
                    'manufacture':"Amazon", 'price':129.00})
                    
db.products.insert({'name':'Kindle Fire', 'category':'Tablets',
                    'manufacture':"Amazon", 'price':199.00})

 

 


 

4. Python 과 Mongo CRUD 작업

 

4.1) 작업 절차

  • 필요한 패키지 설치 : pymongo
  • 데이터베이스 연결 객체 생성 : 데이터베이스 서버, 포트번호, 계정, 비밀번호 - Mongo DB는 로컬에서는 계정과 비밀번호 없이 사용이 가능
  • 데이터베이스 연결
  • 컬렉션 연결
  • 컬렉션에 CRUD 작업 수행

Mongo DB는 프로그래밍 언어와 연동할 때 거의 대부분의 함수가 mongo db 에서의 이름과 동일

삽입, 삭제, 수정의 경우는 수행 결과를 리턴을 하기 때문에 수행한 후 리턴된 객체를 확인하면 성공 여부를 확인 할 수 있다.

 

조회의 경우 여러 개의 데이터를 리턴하는 경우는 cursor를 리턴하므로, for 를 이용해서 순회를 하여 읽어야 합니다.

 

 

4.2) 데이터 삽입

#mongo db 사용을 위한 패키지 import
from pymongo import MongoClient

#연결

conn = MongoClient('localhost', port = 27017)
#help(MongoClient
if conn is not None :
    print("접속 완료")

else :
    print("접속 실패")

db = conn.svng #없으면 생성

#컬렉션 설정

collect = db.data
#데이터 삽입
#삽입이나 삭제 또는 갱신 시 결과를 리턴합니다.

result = collect.insert_one({"empno":"10001","name":"성주",
                    "phone":"010-9742-2257", "age":26})

print(dir(result)) #<pymongo.results.InsertOneResult
# object at 0x0000016CDD1C62F0>
#'acknowledged', 'inserted_id'
print(result.acknowledged)
print(result.inserted_id)

result = collect.insert_many([{"empno":"10002","name":"은애",
                    "phone":"010-7142-7666", "age":26},
                     {"empno":"10003","name":"호잉",
                    "phone":"010-7142-1111", "age":24}
                    ])

print(dir(result))
print(result.inserted_ids)
print(result.acknowledged)

 

 

4.3) 데이터 조회

 

#mongo db 사용을 위한 패키지 import
from pymongo import MongoClient

#연결

conn = MongoClient('localhost', port = 27017)
#help(MongoClient
if conn is not None :
    print("접속 완료")

else :
    print("접속 실패")

db = conn.svng #없으면 생성

#컬렉션 설정

collect = db.data
# #데이터 삽입
# #삽입이나 삭제 또는 갱신 시 결과를 리턴합니다.
#
# result = collect.insert_one({"empno":"10001","name":"성주",
#                     "phone":"010-9742-2257", "age":26})
#
# print(dir(result)) #<pymongo.results.InsertOneResult
# # object at 0x0000016CDD1C62F0>
# #'acknowledged', 'inserted_id'
# print(result.acknowledged)
# print(result.inserted_id)
#
# result = collect.insert_many([{"empno":"10002","name":"은애",
#                     "phone":"010-7142-7666", "age":26},
#                      {"empno":"10003","name":"호잉",
#                     "phone":"010-7142-1111", "age":24}
#                     ])
#
# print(dir(result))
# print(result.inserted_ids)
# print(result.acknowledged)



#데이터 조회
#조회시 cursor를 리턴함
#커서를 순서대로 접근하면 데이터가 dict로 접근 가능합니다.
"""
result = collect.find()
print(result) #cursor

for temp in result :
    print(temp.get("name", "이름 없음")) #name1이 존재하지 않을시, 이름 없음을 출력해줌.
"""

#조건을 설정 후 정렬
result = collect.find({"age": {"$gt": 25}}).sort("age")
for temp in result:
    print(temp.get("name", "이름 없음"))

 

 

4.4) 수정

  • update_one 과 update_many

첫번째 매개변수는 수정할 데이터의 조건이고 두번째 매개변수는 수정할 내용

 

result = collect.find()
for temp in result:
	print(temp)

 

 

4.5) 삭제

  • delete_one 이나 delete_many 함수에 조건만 설정

 

 

## 현재 작업 중인 도커 이미지 저장 및 복원

1. 이미지 저장

docker save -o 이름.tar 이미지이름

 

2. 이미지 복원

docker load -i 이미지 파일경로

 

docker load -i mongo.tar

 

3. 컨테이너 생성해서 사용

반응형
LIST

'LG 헬로비전 DX DATA SCHOOL > DATA BASE' 카테고리의 다른 글

SQL 코테  (0) 2024.04.05
데이터 베이스  (0) 2023.07.25
Oracle  (0) 2023.07.21
파이썬 MySQL 연동  (0) 2023.07.20
DATA BASE 4  (0) 2023.07.20