반응형

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블로그]
반응형

+ Recent posts