Mongodb - Limit Records
-find() 메소드를 더욱 더 활용에 필요한 sort(), limit() , skip() 메소드
-find() 메소드를 사용했을 시 cursor 형태의 결과값을 반환, 이 객체가 가지고 있는 limit() , skip()메소드를 통해 보이는 출력물의 갯수를 제한, sort() 메소드를 사용하여 데이터를 순서대로 나열
1. limit() //db.콜렉션명.find().limit(number)
이 메소드는 출력할 데이터 갯수를 제한할 때 사용. value 파라미터는 출력 할 갯수 값
>db.mycol.find({}, {"title" : 1, _id:0}).limit(2)
{ "title" : "Mongodb"}
{ "title" : "Nosql"}
2. Skip() //db.콜렉션명.find().limit(number).skip(number)
출력 할 데이터의 시작부분을 설정할 때 사용. value 값 갯수의 데이터를 생략하고 그 다음부터 출력
>db.mycol.find({}, {"title" : 1, _id : 0}).limit(1).skip(1)
{ "title" : "Mongodb"}
3.Sort() //db.콜렉션명.find().sort({key : 1})
이 메소드는 데이터를 정렬할 때 사용. 매개변수로는 어떤 KEY 를 사용하여 정렬 할 지 알려주는 document 를 전달
KEY 는 데이터의 field 이름이고, value 의 값은 1 혹은 -1 . 이 값을 1로 설정하면 오름차순으로, -1로 하면 내림차순으로 정렬
또한 여러 KEY를 입력 할 수 있고 먼저 입력한 KEY가 우선권을 가짐.
>db.mycol.find({}, "title" : 1, _id:0}).sort({"title" : -1}) //역순 출력
Mongodb 메뉴얼 (튜토리얼에는 없지만 중요하다)
Embbedded Document(내장형문서) 조회
MongoDB에서는 JSON객체 형태의 문서로 데이터를 저장하는데 문서안에 다시 문서의 내장된 문서의 형태로도 데이터를 저장할 수 있습니다. 그러한 내장형 문서를 조회를 해보겠습니다.
연습을 위해 아래의 데이터를 Insert 합니다.
db.inventory.insertMany( [
{ item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" } ,
{ item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" } ,
{ item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" } ,
{ item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" } ,
{ item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" }
]);
아래는 위에서 실습한 기본적인 형태의 동등 조건의 조회식
size가 h 14이며 w 가 21 uom 이 cm 인 값을 찾습니다.
db.inventory.find( { size: { h: 14, w: 21, uom: "cm" } } )
이러한 형태는 하위 문서와 완전히 똑같은 문서만 찾을 수 있습니다.
아래는 하위문서와 특정 필드에 조건을 걸어 구하는 식.
-size 아래 문서 중 uom 값이 cm 인 값을 구하는 식.
db.inventory.find( { "size.uom": "cm" } )
-size 값 중 h값이 10보다 작은 값.
db.inventory.find( { "size.h": {$lt : 10} } )
-size 값 중 h값이 10보다 작고 status 가 A 인 문서.
db.inventory.find( { "size.h": {$lt : 10}, status : "A"} )
배열값 조회
MongoDB는 배열형태의 값을 저장할 수 있습니다.
연습을 위해 아래의 데이터를 저장합니다.
db.inventory.insertMany([
{ item: "journal", qty: 25, tags: ["blank", "red"], dim_cm: [ 14, 21 ] } ,
{ item: "notebook", qty: 50, tags: ["red", "blank"], dim_cm: [ 14, 21 ] } ,
{ item: "paper", qty: 100, tags: ["red", "blank", "plain"], dim_cm: [ 14, 21 ] },
{ item: "planner", qty: 75, tags: ["blank", "red"], dim_cm: [ 22.85, 30 ] } ,
{ item: "postcard", qty: 45, tags: ["blue"], dim_cm: [ 10, 15.25 ] }
]);
tags 필드에 오직 red값과 blank값만 배열에 존재하는 문서를 조회.
db.inventory.find( { tags: ["red", "blank"] } )
//위 경우는 red와 blank 만 포함된 경우만 출력합니다. 다른 것이 포함된 경우는 출력되지 않습니다.
tags값에 red와 blank 값이 모두 존재하는 문서를 조회.
db.inventory.find( { tags: { $all: ["red", "blank"] } } )
//이 경우는 red와 blank를 포함하고 다른 것들이 포함된 경우도 함께 출력됩니다.
배열이 포함된 필드에 배열 조회가 아닌 단일 값만 조회 값으로 입력했을때의 결과.
db.inventory.find( { tags: "red"} )
//위 결과는 red가 배열에 포함된 모든 문서를 출력합니다.
dim_cm 필드에 25이상 값이 포함된 문서를 출력.
db.inventory.find( { dim_cm: {$gte : 25}} )
dim_cm필드에서 1번째 위치 즉 0번 인덱스에 있는 값 중 14이상인 값.
db.inventory.find( { "dim_cm.0": {$gte : 14}} )
tags 배열의 크기가 2인 문서를 조회합니다.
db.inventory.find( { tags : {$size : 2}} )
Embbedded Document내에서 배열값 조회
연습을 위해 아래 데이터를 입력.
db.inventory.insertMany( [
{ item: "journal", instock: [ { warehouse: "A", qty: 5 } ,
{ warehouse: "C", qty: 15 } ] }
, { item: "notebook", instock: [ { warehouse: "C", qty: 5 } ] } ,
{ item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 15 } ] } ,
{ item: "planner", instock: [ { warehouse: "A", qty: 40 }, { warehouse: "B", qty: 5 } ] } ,
{ item: "postcard", instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ] }
]);
instock 필드에서 { warehouse : "A", qty : 5 } 값을 가지는 document를 조회.
db.inventory.find( { "instock": { warehouse: "A", qty: 5 } } )
그러면 아래의 식은 조회가 될까요?
db.inventory.find( { "instock": { qty: 5, warehouse: "A" } } )
문서(객체)를 동등 비교하는 경우 순서 포함하여 모든 값이 일치해야합니다. -> 조회 안됨
instock 1번째 배열의 qty 값이 40 이상인 값을 조회.
db.inventory.find( { 'instock.0.qty': { $gte: 40 } } )
instock 필드에서 qty가 5이고 warehouse 값이 A인 문서를 조회. 순서는 상관 없습니다.
db.inventory.find( { "instock": { $elemMatch: { qty: 5, warehouse: "A" } } } )
조회 결과에서 필드 표시 여부
find 명령어 두번째 파라미터에서 field 를 표시할지 여부를 지정.
기본적으로 파라미터가 없으면 모두 표시.
document 에 기본적으로 포함된 _id필드를 제외하고 나머지 필드의 경우 '표시할 필드만 입력' 하거나 '표시하지 않을 필드를 표시' 해야 함.
아래의 식은 에러가 발생합니다.
db.inventory.find( { status: "A" }, { item: 1, status: 0 } )
아래의 식은 item 필드와, status 필드 그리고 _id필드가 표시
db.inventory.find( { status: "A" }, { item: 1, status: 1 } )
아래의 식은 item필드와 status필드를 제외한 필드가 표시.
db.inventory.find( { status: "A" }, { item: 0, status: 0 } )
Embedded(내장) 된 문서의 필드 표시는 아래와 같습니다.
db.inventory.find( { status: "A" }, { item: 1, status: 1, "size.uom": 1 } )
Null 값과 필드 존재여부 조회
아래의 식은 item 필드가 null 인 값도 조회 하지만, item 필드가 존재하지 않는 문서도 조회가 됩니다.
db.inventory.find( { item: null } )
item 필드가 존재하지 않는 문서를 조회합니다.
db.inventory.find( { item : { $exists: false } } )
이름설명
$exists | 특정 필드를 가지고 있으면 반환 |
$type | 특정 타입의 필드가 있으면 반환 |
Cursor 반복문
find 명령어는 cursor형태의 객체로 반환이 됩니다.
변수를 할당하고 아래와 같이 javascript 반복문을 활용할 수 있습니다.
var myCursor = db.users.find( { type: 2 } ); while (myCursor.hasNext()) { printjson(myCursor.next()); }
아래와 같이도 가능 합니다.
var myCursor = db.users.find( { type: 2 } ); myCursor.forEach(printjson);
cursor객체를 array(배열) 로 변환할 수 있습니다.
var myCursor = db.inventory.find( { type: 2 } ); var documentArray = myCursor.toArray(); var myDocument = documentArray[3];
출처: https://cionman.tistory.com/48 [Suwoni블로그]
'Database Study > MongoDB' 카테고리의 다른 글
[Mongodb]웹서비스컴퓨팅_9주차 (0) | 2019.12.03 |
---|---|
[Mongodb]웹서비스컴퓨팅_7주차 (0) | 2019.10.15 |
[Mongodb]웹서비스컴퓨팅_6주차 (0) | 2019.10.01 |
[Mongodb]웹서비스컴퓨팅_4주차 (0) | 2019.09.17 |
[Mongodb]웹서비스컴퓨팅_3주차 (0) | 2019.09.10 |