본문 바로가기
국비교육

MongoDB 수업 4일차

by Diligejy 2019. 4. 18.

파일처리 : 일반문서처리, 문서 변환, 좌표를 그리드 영역으로 처리

 

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

댓글