티스토리 뷰

DB/mongodb

Select 문법

sonna 2020. 3. 26. 17:30
반응형

원문 사이트 : https://docs.mongodb.com/manual/tutorial/query-documents/

 

-- Query Documents

-- Query on Embedded/Nested Documents : field의 value가 document인 경우

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" } 
]);

 

1. 기본 Select

     db.inventory.find({})

     = db.getCollection("inventory").find({})

    *mysql : SELECT * FROM inventory

 

2. WHERE절 추가

    db.inventory.find({ status : "D" })

    *mysql : SELECT * FROM inventory WHERE status = 'D'

 

3. 검색하려는 조건값이 여러 개일 때 : OR보다는 IN으로 검색하는 것을 추천

    db.inventory.find({ status : { $in: [ "A", "D" ] } })

    *mysql : SELECT * FROM inventory WHERE status IN ('A', 'D')

 

4. WHERE절에 AND 구문 적용, 비교연산자 적용

    db.inventory.find({ status : "A", qty: { $lt : 30 } })

    *mysql : SELECT * FROM inventory WHERE status = 'A' AND qty < 30

 

5. WHERE절에 OR 구문 적용 

    db.inventory.find({ $or : [{ status : "A" }, { qty : { $lt : 30 } }] })

    *mysql : SELECT * FROM inventory WHERE status = 'A' OR qty < 30

 

6. WHERE절에 AND, OR 구문 복합적용

    db.inventory.find({ status : "A", $or : [{ qty : { $lt : 30 } }, { item : /^p/ }] })

    *mysql : SELECT * FROM inventory WHERE status = 'A' AND ( qty < 30 OR item LIKE 'p%' )

 

7. field의 value가 document인 경우 
   : field의 document가 가지고 있는 filed명, value, 순서가 정확하게 일치하는 경우만 조회된다.

    db.inventory.find({ size : { h : 14, w : 21, uom : "cm" } })
    *db.inventory.find({ size : { w : 21, h : 14, uom : "cm" } })로 검색하는 경우 결과값이 다르다.

 

8. 쿼리 조건이 field에 내장된 document를 이용하는 경우 
   : dot notation을 사용한다. dot notation을 사용할 때 field와 nested field는 반드시 따옴표로 묶어야 한다.

    db.inventory.find({ "size.uom" : "in" })
    db.inventory.find({ "size.h" : { $lt : 15 } })
    db.inventory.find({ "size.h" : { $lt : 15 }, "size.uom" : "in", status : "D" })

 

 

 

-- Query an Array : field의 value가 Array인 경우

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 ] } 
]);

 

9. field의 value가 Array인 경우

   : Array의 원소의 순서도 검색 결과에 영향을 준다.

    db.inventory.find({ tags : ["red", "blank"] })

    *db.inventory.find({ tags : ["blank", "red"] })로 검색하는 경우과 결과값이 다르다.

 

10. 순서에 상관없이 원소를 가지고 있는 document를 검색하는 경우

    db.inventory.find({ tags : { $all : ["red", "blank"] } })

 

11. 특정 원소를 가지고 있는 document를 검색하는 경우

    db.inventory.find({ tags : "red" })

 

12. 원소에 조건을 적용하여 검색하는 경우

    db.inventory.find({ dim_cm : { $gt : 25 } })

 

13. 원소에 복수개의 조건을 적용하여 검색하는 경우

     : 원소 중 15보다 큰 원소가 있고, 20보다 작은 원소도 있으면 검색된다.

       (전자의 조건을 만족하는 원소와 후자의 조건을 만족하는 원소가 서로 다른 원소여도 가능하다.)

       만약 한 원소가 15보다 크고 20보다 작으면 검색된다.

    db.inventory.find({ dim_cm : { $gt : 15, $lt : 20 } })

 

14. 22보다 크고 30보다 작은 원소를 가지고 있는 경우만 검색된다.

    db.inventory.find({ dim_cm : { $elemMatch : { $gt : 22, $lt : 30 } } } )

 

15. Array Index를 이용하여 검색하는 경우

    : dot notation을 사용한다. "field.인덱스번호"로 원소를 검색한다. 0부터 시작하는 인덱싱 사용.

    db.inventory.find( { "dim_cm.1" : { $gt : 25 } } )

 

16. Array 원소 길이를 이용하여 검색하는 경우

     : $size operator와 dot notation을 사용한다. 

     db.inventory.find( { "tags" : { $size : 3 } } )

 

 

 

-- Query an Array of Embedded Documents : field의 value가 Document를 원소로 하는 Array인 경우

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 } ] }
]);

 

17. field의 value가 Document를 원소로 하는 Array인 경우

     : 원소인 Document의 field 순서도 일치해야 검색된다.

    db.inventory.find( { "instock": { warehouse: "A", qty: 5 } } )

    *db.inventory.find( { "instock": { qty: 5, warehouse: "A" } } )로 검색하는 경우과 결과값 다름.

 

18. 원소인 Document의 field 순서에 상관없이 검색하는 경우

    db.inventory.find( { "instock": { $elemMatch : { qty: 5, warehouse: "A" } } } )

 

19. 원소인 Document의 field에 조건을 적용하여 검색하는 경우

    db.inventory.find( { 'instock.qty' : { $lte : 20 } } )

    = db.inventory.find( { "instock.qty" : { $lte : 20 } } )   

 

20. 원소인 Document의 field에 조건을 적용하여 검색하는 경우

     : 10보다 크고 20보다 작거나 같은 원소가 있는 경우만 검색된다.

    db.inventory.find( { "instock": { $elemMatch: { qty: { $gt: 10, $lte: 20 } } } } )

 

21. 원소인 Document의 field에 조건을 적용하여 검색하는 경우

     : 10보다 큰 원소가 있고, 20보자 작은 원소도 있으면 검색된다.

      (전자의 조건을 만족하는 원소와 후자의 조건을 만족하는 원소가 서로 다른 원소여도 가능하다.)

    db.inventory.find( { "instock.qty": { qty: { $gt: 10, $lte: 20 } } } } )

     : instock field의 Array 원소 중에 qty field 값이 5인 document를 원소로 가지고 있고,

       warehouse field 값이 A인 document도 원소로 가지고 있으면 검색된다.

    db.inventory.find( { "instock.qty": 5, "instock.warehouse": "A" } )

 

22. Array Index를 이용하여 검색하는 경우

     : 'field.인덱스번호.원소인 Document의 field'

    db.inventory.find( { 'instock.0.qty' : { $lte : 20 } } )

    = db.inventory.find( { "instock.0.qty" : { $lte : 20 } } )

 

반응형

'DB > mongodb' 카테고리의 다른 글

mongodb 설치  (0) 2020.03.19
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함