함께 성장하는 프로독학러

3. find() 의 결과를 활용, sort(), limit(), skip() 본문

Programming/MongoDB

3. find() 의 결과를 활용, sort(), limit(), skip()

프로독학러 2018. 5. 6. 20:03

안녕하세요, 프로독학러 입니다.


이번 포스팅에서는 저번 포스팅에서 알아본 find() 메소드를 통해 조회한 도큐먼트들을 정렬, 제한, 건너뛰는 메소드에 대해서 알아보도록 하겠습니다.

저번 포스팅에서 언급한 바와 같이 find() 메소드의 리턴값은 cursor 객체 입니다.

cursor 객체는 find() 메소드의 query 와 projection 을 통해 나온 도큐먼트들을 담고있는 객체로, sort(), limit(), skip() 메소드를 가지고 있습니다.

sort(), limit(), skip() 메소드에 대해서 차례로 알아보도록 합시다.

*find() 메소드에 익숙하지 않으신 분들은 아래의 링크를 참조해 주세요.

<Document 를 검색하는 메소드 - find() 메소드>


가장 먼저, 

sort(), limit(), skip() 메소드를 연습하기 위한 샘플 도큐먼트들을 orders 컬렉션에 추가해 줍시다.


db.orders.insert([

    { "_id": 1, "item": { "category": "cake", "type": "chiffon" }, "amount": 10 },

    { "_id": 2, "item": { "category": "cookies", "type": "chocolate chip" }, "amount": 50 },

    { "_id": 3, "item": { "category": "cookies", "type": "chocolate chip" }, "amount": 15 },

    { "_id": 4, "item": { "category": "cake", "type": "lemon" }, "amount": 30 },

    { "_id": 5, "item": { "category": "cake", "type": "carrot" }, "amount": 20 },

    { "_id": 6, "item": { "category": "brownies", "type": "blondie" }, "amount": 10 }

])


orders 컬렉션에 Document 들을 추가했으면 본격적으로 sort(), limit(), skip() 메소드에 대해서 알아보겠습니다.


cursor.sort(DOCUMENT)


sort() 메소드는 데이터를 정렬할 때 사용됩니다.

메소드의 매개변수로는 도큐먼트의 어떤 key 를 사용하여 도큐먼트들을 정렬할지 알려주는 document(객체) 를 전달합니다. 


cursor.sort(DOCUMNET)


매개변수로 들어오는 DOCUMENT 의 구조는 다음과 같습니다.


{ KEY : value }


여기서 KEY 는 정렬할 기준이 되는 field 의 이름이고, value 의 값은 1 혹은 -1 입니다.

value 의 값이 1 이면 오름차순으로 정렬하고, -1 이면 도큐먼트들을 내림차순으로 정렬합니다.


또한 KEY 와 value pair 는 한 쌍 이상이 될 수 있고, 여러개의 KEY value pair 가 들어오면 가장 먼저 입력한 KEY 값이 우선권을 갖습니다.


ex) _id 필드를 기준으로 오름차순으로 정렬


db.orders.find().sort({_id:1})



ex) amount 필드를 기준으로 오름차순 정렬, _id 필드를 기준으로 내림차순으로 정렬


db.orders.find().sort({amount:1, _id:-1})



우선권은 amount, _id 필드 순.

첫 번째와 두 번째 도큐먼트는 amount 값이 같지만 _id 를 내림차순으로 정렬하기 때문에 _id 값이 6인 도큐먼트가 먼저 출력됨.


cursor.limit(value)


limit() 메소드는 출력하는 도큐먼트의 갯수를 제한하는 메소드 입니다. 

메소드의 인자 value 의 값으로 숫자가 들어가는데, 이는 출력할 갯수입니다.


ex) orders 컬렉션의 모든 데이터를 조회, 갯수는 3개로 제한


db.orders.find().limit(3)



cursor.skip(value)


skip() 메소드는 출력할 데이터의 시작부분을 설정하는 메소드 입니다.

value 값으로는 생략할 데이터의 갯수가 들어옵니다.

즉, 메소드의 인자로 들어오는 value 값 만큼 건너뛰고, value+1 부터 출력하는 것입니다.


ex) 2개의 데이터를 생략하고, 3 번째 데이터부터 출력


db.orders.find().skip(2)



_id 값이 1, 2 인 두 개의 도큐먼트를 건너뛰고(skip) 세 번째 데이터부터 출력한 것을 알 수 있습니다.


practical use - page nation


지금까지 살펴본 sort(), limit(), skip() 메소드를 활용하여 간단한 페이지네이션을 구현해 보도록 하겠습니다.


ex) orders 의 다큐먼트들을 최신순으로 페이지네이션 하는데, 한 페이지에 2 개씩 나타냅니다.


가장 먼저 showPage 함수를 정의해 줍니다.

*(MongoDB 는 자바스크립트 기반이기 때문에 MongoDB Shell 에서 자바스크립트 표현식을 사용할 수 있습니다.)


var showPage = function(page) {

return db.orders.find().sort({_id:-1}).skip((page-1)*2).limit(2);

}


showPage 함수의 인자로는 page 가 들어오는데, 이는 페이지 넘버를 의미합니다.

들어온 값이 1이면 (1페이지) 0 만큼 건너뛰고 2개를 표시, 2페이지면 2만큼 건너뛰고 2개를 표시하는 식이죠.


showPage(1)

showPage(2)

showPage(3)



*_id 가 높을수록 최근에 작성된 글이라고 가정


여기까지


find() 메소드를 통해 조회된 Document 들을 정렬, 갯수제한, 건너뛰는 방법에 대해서 알아보았습니다.

이로서 find() 를 통해 조회된 Document 들을 좀 더 원하는 대로 핸들링 할 수 있게 되었습니다.

다음 포스팅에서는 document 를 수정하는 메소드인 update() 메소드에 대해서 알아보도록 하겠습니다.


**참고 자료 (항상 감사드립니다)

https://velopert.com/516


*이 포스팅이 도움이 되셨다면 다녀가셨다는 표시로 공감 부탁드릴게요! (로그인 하지 않으셔도 공감은 가능합니다 ㅎㅎ)

Comments