2023/07/24
Mongo DB
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 과 함께 기재하면 데이터의 순서에 상관없이 포함하고 있으면 조회
- 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. 컨테이너 생성해서 사용
'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 |