ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • MongoDB 데이터 검색, 정렬, 수정, 삭제기능으로 CRUD 앱 구현
    프로그래밍/HTML5 Web 2016. 7. 7. 17:52
    반응형


    본 게시글은 http://writingdeveloper.tistory.com/205 의 사전지식이 있어야 구현이 가능하므로 미숙한 부분에 대해선 링크를 참조하시길바랍니다.



    데이터 검색


    데이터를 검색할때에는 find() 메서드를 이용하는데 find()메서드를 이용하면 데이터를 배열의 형태로 추출이 가능합니다.



    원하는 속성을 추출하지 않고 싶을 때에는 find() 메서드의 두 번째 매개변수에 속성을 선택하고 불을 입력하면됩니다.

    _id 속성을 false값으로 지정하였으므로 _id값을 출력하지 않습니다. 하지만 일반적으로 find()메서드를 사용할때 _id 속성은반드시 추출하므로 대부분 _id 속성이외의 속성에 true또는 false값을 입력하는데 true와 false중 하나만 사용해서 값을 추출하는것이 코드의 가독성을 높혀줍니다.




    find() 메서드의 첫번째 매개변수로 조건을 검사하는데 예를 들어 price 속성이 500인 데이터만 추출해보도록 하겠습니다.



    숫자 범위를 선택하고 싶을 때에는 연산자를 사요하면 되는데 MongoDB의 연산자는 뒷부분에서 다루도록 하겠습니다.


    객체하나만  추출할때에는 findOne() 메서드를 사용합니다. findOne() 메서드를 사용하면 find()메서드로 추출할수 있는 배열의 가장 첫 번째에 위치한 데이터를 추출합니다.



    데이터 정렬


    데이터를 정렬할 때는 sort()메서드를 사용하는데 매개변수에 정렬 기준이 될 속성을 입력하고 양수 또는 음수를 입력하여 오름차순 정렬과 내림차순 정렬을 지정합니다. 다음의 명령어는 name 속성을 사용하여 오름차순으로 정렬합니다.


    1
    2
    3
    4
    5
    6
    7
    > db.products.find({price:500},{_id:false}).sort({name:1})
    "name" : "eraser""price" : 500 }
    "name" : "eraser""price" : 500 }
    "name" : "knife""price" : 500 }
    "name" : "pencil""price" : 500 }
    "name" : "protractor""price" : 500 }
    >
    cs


    다음 명령어는 price속성을 사용하여 내림차순 정렬합니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    > db.products.find({},{_id:false}).sort({price:-1})
    "name" : "stapler""price" : 3000 }
    "name" : "notebook""price" : 2000 }
    "name" : "scissors""price" : 2000 }
    "name" : "brush""price" : 2000 }
    "name" : "pen""price" : 1000 }
    "name" : "glue""price" : 700 }
    "name" : "eraser""price" : 500 }
    "name" : "pencil""price" : 500 }
    "name" : "eraser""price" : 500 }
    "name" : "knife""price" : 500 }
    "name" : "protractor""price" : 500 }
    >
    cs



    특정 위치에 있는 데이터 선택


    게시판이나 상품 목록의 경우 데이터베이스에서 특정 위치의 데이터를 선택하는 기능이 필요합니다. 일반적으로 상품 목록이 있는 페이지에서 밑에 페이지 넘버가 존재하고 각 페이지마다 몇개씩의 데이터가 존재하는걸 볼수 있는데요. MongoDB에서 이러한 기능을 구현하려면 limit() 메서드와 skip() 메서드를 이용하여야합니다.




    우선 limit() 메서드를 활용하기 위해서 sort() 메서드를 사용하여 price속성으로 오름차순 정렬하고 limit() 메서드를 사용하여 상위 3개의 데이터만 추출합니다.


    1
    2
    3
    4
    5
    db.products.find().sort({price:1}).limit(3)
    "_id" : ObjectId("577d19898dcc1d0cf901ba16"), "name" : "eraser""price" : 500 }
    "_id" : ObjectId("577d19898dcc1d0cf901ba17"), "name" : "pencil""price" : 500 }
    "_id" : ObjectId("577d19898dcc1d0cf901ba18"), "name" : "eraser""price" : 500 }
    >
    cs


    skip() 메서드는 건너뛰는 기능을 수행하는데 아래의 명령어를 사용하면 3개의 데이터를 뛰어넘어 2개의 데이터를 선택합니다.


    1
    2
    3
    4
    > db.products.find().sort({price:1}).skip(3).limit(2)
    "_id" : ObjectId("577d19898dcc1d0cf901ba1f"), "name" : "knife""price" : 500 }
    "_id" : ObjectId("577d198a8dcc1d0cf901ba20"), "name" : "protractor""price" : 500 }
    >
    cs


    데이터 수정


    MongoDB는 save()메서드를 사용하여 _id속성이 일치하는 데이터를 저장하면 자동으로 원래 데이터를 수정합니다. 예로 다음 명령어를 통해 name속성이 knife인 데이터를 추출해 변수 temp에 저장해보도록 하겠습니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    > var temp=db.products.findOne({name:'knife'})
     
    > temp
    {
            "_id" : ObjectId("577d19898dcc1d0cf901ba1f"),
            "name" : "knife",
            "price" : 500
    }
    >
    cs


    위와 같이 temp를 입력하면 temp변수 안에 knife값이 저장되어있습니다. temp 변수의 price 속성을 변경한 뒤에 save() 메서드를 사용하면 데이터가 자동으로 수정됩니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    > temp.price=700
    700
    > db.products.save(temp)
    WriteResult({ "nMatched" : 1"nUpserted" : 0"nModified" : 1 })
    > temp
    {
            "_id" : ObjectId("577d19898dcc1d0cf901ba1f"),
            "name" : "knife",
            "price" : 700
    }
    >
    cs


    데이터 수정 방법에는 위와 같은 방법으로 save()메서드를 활용하여 수정하는 방법도 있고 update() 메서드를 사용해서 데이터 수정도 가능합니다.

    update() 메서드는 다음과 같은 형태를 갖고있습니다.


    1
    db.collection.update(criteria, objNew, upsert, multi)
    cs


    다음 명령어를 통해 name 속성이 knife인 객체의 price 속성을 변경할수 있습니다. update() 메서드의 두번째 매개변수에 $set 연산자를 사용하였습니다.


    1
    2
    3
    > db.products.update({name:'knife'},{$set:{price:500}}, falsefalse)
    WriteResult({ "nMatched" : 1"nUpserted" : 0"nModified" : 1 })
    >
    cs


    데이터 삭제


    데이터를 삭제할 때는 remove() 메서드를 사용합니다. 예로 name 속성이 protractor 인 객체를 삭제하고 싶을 때는 다음 명령어를 사용합니다.


    1
    2
    3
    > db.proudcts.remove({name:'protracor'});
    WriteResult({ "nRemoved" : 0 })
    >
    cs


    주의할 점은 매개변수를 입력하지 않고 remove() 메서드를 사용하게되면 모든 데이터를 제거하므로 주의해서 사용해야합니다.

    1
    2
    db.products.remove()
     
    cs


    MongoJS 모듈


    MySQL 데이터베이스에서는 대부분 mysql 모듈을 사용하여 제어하지만 MongoDB에는 굉장히 많은 모듈이 있으므로 Node.js에서 사용이 가장 간단한 mongojs 모듈을 통하여 MongoDB와 Node.js 의 연결을 해보도록 하겠습니다.



    여기 링크를 통하거나 npm으로 mongojs모듈을 설치합니다. (https://github.com/mafintosh/mongojs)


    1
    $npm install mongojs
    cs


    그리고 아래 코드로 find() 메서드와 mongojs를 연결하여 data를 콘솔로 출력합니다.


    1
    2
    3
    4
    5
    6
    7
    8
    // Connect DB
    var db = require('mongojs').connect('node', ['products']);
     
    // Extract Data
    db.products.find(function (error, data) {
        console.log(data);
    });
     
    cs

    그동안 메서드가 수정된 부분이 있다고합니다!! .connect 메서드가 사라짐에 따라 생략하고 사용가능하다고합니다. 그렇지 않으면 에러가 발생합니다. 위의 코드는 아래와 같이 수정해주셔야합니다!!


    1
    2
    3
    4
    5
    6
    7
    8
    // Connect DB
    var db = require('mongojs')('node', ['products']);
     
    // Extract Data
    db.products.find(function (error, data) {
        console.log(data);
    });
     
    cs


    마무리 지으며


    여기저기 검색하면서 작성하였는데 중구난방으로 작성된게 아닌가 모르겠습니다. MongoDB를 다룬 부분에서 여기까지부분으로 데이터 입출력을 저장, 및 수정 삭제를 가능하게하는 CRUD 앱 구현이 가능합니다. 그동안 Node.JS버전 올림도 많이 되었고 그새 MongoDB 버전도 한단계나 올라가버린바람에 공부할게 정말 많아졌네요. 이후로 작성할 게시글에 대해선 이제 본격적으로 HTML5 관련 프레임워크를 활용하여 실제 SNS 제작, HTML5의 고급기능과 자바스크립트를 활용한 backbone.js, 구글에서 개발중이 Angular.js와 같은 MVC 프레임워크들을 주제로 다뤄볼까합니다. 저또한 입문자로 모르는 부분, 넘기고 간 부분들이 많은것 같네요. 혹 궁금하신 점이나 모르는 점이 있으시다면 댓글을 통해 질문주시면 최대한 빠르게 답변드리도록 하겠습니다. 감사합니다~

    반응형

    댓글

Designed by Tistory.