티스토리 뷰
원문 사이트 : 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 |
---|