파일처리 : 일반문서처리, 문서 변환, 좌표를 그리드 영역으로 처리
1. 일반문서처리
MongoDB표준명령 : mongofiles를 사용한다.
명령어
put
get
search
delete
option : "-d"로 DB로 지정 -v 이중화(파일을 올릴 때 쓰레드에 안전하다)
cf. 일반적으로 MongoDB에 저장할 수 있는 파일의 크기는 16MB 단위로 이루어진다.
16MB이상은 GridFS를 사용한다.
GridFS는 MongoDB 데이터를 분할해서 (입/출력) 하기 위한 인터페이스
C:\TEST>mongofiles -v -d images put a.jpg
C:\TEST>mongofiles -v -d images put b.jpg
C:\TEST>mongofiles -v -d images put c.jpg
C:\TEST>mongofiles -v -d images put d.txt
C:\TEST>mongofiles -v -d images put e.txt
2.
1) 파일 업로드 확인
- show collections
ⓐ fs.chunks : bson형태를 통해 put으로 올린 파일의 내용을 저장한다.
ⓑ fs.files : put으로 올린 파일의 정보를 저장한다.
chunks "files_id" = files "_id"
- db.fs.files.find()로
"files_id" : ObjectId("5cb7c5447cc32064dcd07e0d")확인 후
- db.fs.chunks.find({"files_id" : ObjectId("5cb7c5447cc32064dcd07e0d")}).pretty()
- db.fs.files.find({"_id" : ObjectId("5cb7c5447cc32064dcd07e0d")}).pretty()
2) 파일 다운로드
mongofiles -v -d images get c.jpg
3) 파일 삭제
mongofiles -v -d images(db명이다 image가 아니라) delete 파일
3. 문서변환
mongoimport
mongoexport
-h : mongodb에서 지정되는 url
-d : database
--file : 현재 json파일
-type : json, csv, tsv(Tab separated values), txt
-c : --collection
-f : --fields
--drop
--out
1) myScore db의 Score컬렉션을 score.json으로 출력하는 법
c:\test>mongoexport --db myScore -c Score --out score.json
2) 폴더에 있는 파일을 형식에 맞추어 올리고 싶다.
db : newdb
collection : newaddr
c:\test>mongoimport --db newdb --collection newaddr --file myaddr.json
c:\test>mongoexport --db newdb -c newaddr --out abc.json
*연습문제*
3) myaddr.json을 newdb의 addrtest라는 컬렉션으로 import한다.
c:\test>mongoimport --db newdb --collection addrtest --file myaddr.json
4) addrtest라는 컬렉션을 myexport.json으로 export한다.
c:\test>mongoexport --db newdb -c addrtest --out myexport.json
5) addrtest라는 컬렉션을 mycsv.csv로 export한다.
c:\test>mongoexport --db newdb -c addrtest --type csv --out mycsv.csv
c:\test>mongoexport -d myScore -c Score -f name, kor --type csv > abc.csv
c:\test\mongoexport -d myScore -c Score -f name, kor -o abcres04.csv
6) addrtest라는 컬렉션을 mytsv.tsv로 export한다.
c:\test>mongoexport --db newdb -c addrtest --type tsv --out mytsv.tsv
4.
1) 점 : $geometry : {type : "Point" coordinates : [lon, lat]}
2) 직선 : $geometry : {type : "LineString" coordinates : [lon, lat, lon, lat]}
3) 다각형 : $geometry : {type : "Polygon" coordinates : [lon, lat, lon,lat]}
좌표 점 [x1, y1]
좌표 사각 $box : [x1, y1, x2, y2]
좌표 다각형 $polygon : [x1, y1, x1, y2, x2, y2, x2, y1]
좌표 원형 $center : [x1, y1, r]
좌표 지구 표면에 원형 $centerSphere : [x, y, radius]
5. 실제 하는 방법
1) collection 생성 ex) {loc : [10, 20] }
2) index 지정, collection.ensureIndex({loc : "2d"} ) 2d, 2dsphere
3) collection 입력한 좌표를 가지고 $near 등의 연산자로 원하는 지점을 구한다.
6. 연습문제
1) use myloc
ⓐ Step1
db.createCollection("location");
db.location.save({_id:"A", position : [0.001, -0.0002]});
db.location.save({_id:"B", position : [1.0, 1.0]});
db.location.save({_id:"C", position : [0.5, 0.5]});
db.location.save({_id:"D", position : [-0.5, -0.5]});
db.location.save({_id:"E", position : [0.2, 0.2]});
ⓑ Step02
db.location.ensureIndex({position:"2d"});
ⓒ Step03 collection에 입력한 좌표를 가지고 $near등의 연산자로 원하는 지점을 구한다.
ex) position 0.0 가장 큰 영역 거리의 0.75
db.location.find({position : {$near : [0, 0], $maxDistance : 0.75} })
ⓓ db.location.find({position : {$near : [0,0], $minDistance : 0.3 , $maxDistance : 0.75}})
ⓔ db.location.find({position : { $geoWithin: {$box: [ [0.25, 0.25], [1.0, 1.0] ] } }})
2)
db.my_loc.ensureIndex({location : '2d'}, {min : {'x' : 0, 'y' : 0}, max : {'x':100, 'y':100}});
센터 실습(원) : db.my_loc.find({location : {$geoWithin : {$center : [{x:20, y:20}, 5] }}});
박스 실습 : db.my_loc.find({location : {$geoWithin : {$box : [[ 1.25, 1.25], [50.0, 50.0]]}}})
6.
use geotest
var baseLng = 120;
var baseLat = 30;
var diffLng = 121;
var diffLat = 31;
var categories = ['카페9' , '멜로우' , '레트로'];
for(var i = 1 ; i<=100;i++ ){
var myLng = baseLng + (Math.random()*diffLat);
var myLat = baseLat + (Math.random()*diffLng);
var myCategory = categories[Math.floor(Math.random()*categories.length)];
db.places.save({
location : [myLng,myLat],
category : myCategory
});
}; // for end
ⓐ 인덱스 작성
db.places.ensureIndex({location : "2d", category : 1})
ⓑ 구로 00 건물 근처 멜로우을 찾아라
db.places.find({category : "멜로우"})
ⓒ 레트로을 찾아라
db.places.find({category : "레트로"})
ⓓ 카페9를 찾아라
db.places.find({category:"카페9"}).count()
ⓔ 원하는 위치 근처에 가장 가까운 편의점, 은행, 커피 중 10개만 추출
db.places.find( { location: { $near : [ 116.89, 34.1251] }, category : "멜로우" } ).limit(10)
'국비교육' 카테고리의 다른 글
MongoDB 6일차 (0) | 2019.04.22 |
---|---|
MongoDB 5일차 (0) | 2019.04.19 |
MongoDB 수업 3일차 (0) | 2019.04.17 |
MongoDB 수업 2일차 - 쿼리 (0) | 2019.04.16 |
MongoDB 수업 1일차 - 개론 (0) | 2019.04.15 |
댓글