[꿀팁] 화면 우측에서 Select your language 드롭다운 메뉴를 클릭하면 다양한 프로그래밍 언어로 Mongo DB를 사용할 수 있다.
* 주의사항 : 해당 블로그 글보다 참조문서를 영어로 직접 읽어보고 직접 쿼리를 해보는 것이 좋다.
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 ] }
]);
* 검색하고 싶은 배열과 정확히 일치하는 도큐먼트 쿼리
db.inventory.find( { tags: ["red", "blank"] } )
tags 배열에서 "red"와 "blank" 만 존재하고 순서까지 동일해야 한다. notebook 만 검색된다.
* 특정 배열요소들을 모두 포함하지만 순서는 상관없는 도큐먼트 쿼리
db.inventory.find( { tags: { $all: ["red", "blank"] } } )
tags 배열에서 "red"와 "blank" 를 모두 포함하지만 순서는 상관이 없어도 된다. tags 배열에서 "red" 와 "blank" 를 모두 포함하고 있는 journal, notebook, paper, planner 이 검색된다.
* 특정 배열요소를 포함하고 있는 도큐먼트 쿼리
db.inventory.find( { tags: "red" } )
tags 배열에서 "red" 를 포함하고 있으면 검색이 된다. tags 배열에서 "red" 를 포함하고 있는 journal, notebook, paper, planner 이 검색된다.
* 특정 조건을 만족하는 배열요소를 하나 이상 포함하고 있는 도큐먼트 쿼리
db.inventory.find( { dim_cm: { $gt: 25 } } )
dim_cm 배열에서 25보다 큰 배열요소를 하나 이상 포함하고 있으면 검색이 된다. dim_cm 배열에서 25보다 큰 배열요소를 하나 이상 포함하고 있는 도큐먼트는 planner 이다.
* 다수의 조건을 모두 만족하는 배열요소를 하나 이상 포함하고 있는 도큐먼트 쿼리 (좀 헷갈릴수 있음)
db.inventory.find( { dim_cm: { $gt: 15, $lt: 20 } } )
dim_cm 배열에서 15보다 큰 배열 요소도 하나 이상 있어야 하고, 20보다 작은 배열 요소도 하나 이상 있어야 한다. (따로 따로 두 조건을 모두 만족해야 한다.) 물론, 15보다 크고 20보다 작은 (두 조건을 동시에 만족하는) 배열요소가 하나 이상 있어도 검색이 된다. 현재 위 조건으로 planner 도큐먼트는 검색되지 않는다. 왜냐하면 15보다 큰 요소는 존재하지만, 20보다 작은 요소는 없기 때문이다.
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: [ 17 ] },
{ item: "postcard", qty: 45, tags: ["blue"], dim_cm: [ 10, 15.25 ] }
]);
데이터셋을 좀 변경해서 planner 도큐먼트의 dim_cm 배열에 17만 넣어도 검색이 된다. 그 말인 즉슨 15보다 크고 20보다 작은 (두 조건을 동시에 만족하는) 배열요소가 하나 이상 있어도 검색이 된다.
* 다수의 조건을 동시에 만족하는 배열요소를 하나 이상 포함하고 있는 도큐먼트 쿼리
db.inventory.find( { dim_cm: { $elemMatch: { $gt: 22, $lt: 30 } } } )
dim_cm 배열에서 22보다 크고 30보다 작은 (두 조건을 동시에 만족하는) 배열요소를 하나 이상 포함하고 있으면 검색이 된다. dim_cm 배열에서 22보다 크고 30보다 작은 값을 하나 이상 가진 도큐먼트는 22.85 를 가진 planner 뿐이다.
* 배열 인덱스로 가져온 배열요소가 특정 조건을 만족하는 도큐먼트 쿼리
db.inventory.find( { "dim_cm.1": { $gt: 25 } } )
dim_cm 배열의 두번째(배열은 0번부터 시작하므로) 요소가 25보다 큰 도큐먼트를 검색한다. dim_cm 배열의 두번째 요소가 25보다 큰 값을 가진 도큐먼트는 30을 포함하고 있는 planner 뿐이다.
* 배열 길이가 일치하는 도큐먼트 쿼리
db.inventory.find( { "tags": { $size: 3 } } )
tags 배열의 길이가 3인 도큐먼트를 검색한다. tags 배열의 길이가 3인 도큐먼트는 "red" "blank" "plain" 요소를 가진 paper 뿐이다.
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}, { warehouse: "C", qty: 15 } 등은 모두 데이터 모델에 의하여 생성된 도큐먼트이다.
* 검색하고 싶은 객체와 정확히 일치하는 도큐먼트 쿼리
db.inventory.find( { "instock": { warehouse: "A", qty: 5 } } )
instock 배열에서 { warehouse: "A", qty: 5 } 객체를 포함하고 있는 도큐먼트를 검색한다. instock 배열에서 { warehouse: "A", qty: 5 } 객체를 포함하고 있는 도큐먼트는 journal 뿐이다. warehouse, qty 의 순서도 동일해야 한다. 만약 { qty: 5, warehouse: "A" 로 쿼리하면 어떤 도큐먼트도 검색되지 않는다.
* 배열요소(객체)의 필드가 특정조건을 만족하는 도큐먼트 쿼리
db.inventory.find( { 'instock.qty': { $lte: 20 } } )
instock 필드는 배열이지만 내부에 객체가 있으면 객체의 필드를 instock 필드와 점(.)으로 연결할 수 있다. 즉, instock 배열에서 qty 필드가 20보다 작거나 같은 객체를 하나 이상 포함하고 있으면 검색이 된다. 모든 도큐먼트가 해당 조건을 만족한다.
* 필드를 점(.)으로 연결할때는 반드시 따옴표로 묶어줘야 한다.
* 인덱스로 선택한 배열요소(객체)의 필드가 특정 조건을 만족하는 도큐먼트 쿼리
db.inventory.find( { 'instock.0.qty': { $lte: 20 } } )
instock 배열에서 첫번째 배열요소(객체)의 qty 필드가 20보다 작거나 같은 도큐먼트를 검색한다. 해당 조건을 만족하는 도큐먼트는 journal, notebook, postcard 이다.
* 검색조건을 모두 만족하지만 필드순서는 상관없는 도큐먼트 쿼리
db.inventory.find( { "instock": { $elemMatch: { qty: 5, warehouse: "A" } } } )
instock 배열에서 qty가 5이고, warehouse가 "A"라는 조건을 모두 포함하는 객체가 하나 이상 있으면 검색이 된다. 필드 순서는 상관이 없다. 해당 조건을 만족하는 도큐먼트는 journal 뿐이다. 데이터셋을 조금 변경해서 아래와 같이 작성하고 같은 쿼리를 주면 어떻게 될까?
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 }, { qty: 5, price: 30, warehouse: "A" } ] },
{ item: "postcard", instock: [ { warehouse: "A", qty: 15 }, { warehouse: "C", qty: 5 } ] }
]);
journal, planner 도큐먼트가 검색된다.
* 연습과제 1
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 ] }
]);
위 데이터셋에서 postcard 도큐먼트만 추출하는 쿼리를 작성해보자! 여러가지 방법이 존재하므로 다양한 쿼리로 최대한 많은 방법을 찾아보자!
* 연습과제 2
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 ] }
]);
위 데이터셋에서 paper 도큐먼트만 추출하는 쿼리를 작성해보자! 여러가지 방법이 존재하므로 다양한 쿼리로 최대한 많은 방법을 찾아보자!
* 연습과제 3
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 } ] }
]);
위 데이터셋에서 paper 와 planner 도큐먼트만 추출하는 쿼리를 작성해보자! 여러가지 방법이 존재하므로 다양한 쿼리로 최대한 많은 방법을 찾아보자!
* 연습과제 4
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 } ] }
]);
위 데이터셋에서 journal 과 notebook 도큐먼트만 추출하는 쿼리를 작성해보자! 여러가지 방법이 존재하므로 다양한 쿼리로 최대한 많은 방법을 찾아보자!
'데이터베이스 > MongoDB 수업' 카테고리의 다른 글
0. 몽고DB - 설치 가이드 (최신) (0) | 2024.04.03 |
---|---|
3. 몽고 DB - aggregation (집계, 합산) (0) | 2023.08.02 |
1. 몽고 DB - 데이터 CRUD (생성, 조회, 변경, 삭제) (0) | 2021.10.04 |