[MongDB]조회문제 숙제 풀이

MongoDB 조회 문제

  • 강사님이 내주신 조회문을 연습하는 숙제다.

데이터

  • inventory라는 Collection에 해당 데이터들을 삽입해준다.
db.inventory.insertMany( [
	{ item: "canvas", qty: 100, size: { h: 28, w: 35.5, uom: "cm" }, status: "A" },
	{ item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },	
	{ item: "mat", qty: 85, size: { h: 27.9, w: 35.5, uom: "cm" }, status: "A" },
	{ item: "mousepad", qty: 25, size: { h: 19, w: 22.85, uom: "cm" }, status: "P" },
	{ item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "P" },
	{ 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" },
	{ item: "sketchbook", qty: 80, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
	{ item: "sketch pad", qty: 95, size: { h: 22.85, w: 30.5, uom: "cm" }, status: "A" }
] );

문제

  1. _id만 빼고 전체출력
    • 내 답 : db.inventory.find({},{_id:0})
    • 풀이 :
      • find()는 MongoDB에서 데이터를 조회하는 명령어로, 첫 파라미터는 query로 조회할 데이터를 선택해준다. 전체 출력이므로 {}와 같이 적어주면 된다. 또한 두 번재 파라미터는 projection으로 출력할 필드를 정하는데, 0은 False, 1은 True로 False로 지정을하면 출력되지 않는다.
      • _id는 RDBMS에서의 주요키(Primary Key) 같은 개념으로 명시하지 않으면 자동으로 생성된다.
  2. status가 D인 document
    • 내 답 : db.inventory.find({status:'D'})
    • 풀이 :
      • 첫 파라미터의 선택 부분에서 status field 값이 'D'인 것을 출력하는 문제다.
  3. qty가 높은 순부터 (내림차순)
    • 내 답 : db.inventory.find().sort({qty:-1})
    • 풀이:
      • MongoDB에서는 .sort()를 사용해서 정렬을 할 수 있다. 필드를 정해준 뒤, 값으로 1을 넣으면 오름차순(ASC), -1을 넣으면 내림차순(DESC)으로 정렬해준다.
      • find()에 아무것도 적지 않으면 전체를 다 출력해주는 것이다.
  4. qty가 80 미만인 document를 낮은 순부터 (오름차순)
    • 내 답 : db.inventory.find({qty:{$lt:80}}).sort({qty:1})
    • 풀이 :
      • query 선택 부분에서 qty field가 80 미만인 경우를 찾아줘야한다. 미만은 $lt로 less than을 의미한다. {$lt:80}은 80 미만을 뜻한다. 만약 이하로 값을 찾고 싶다면 $lte를 사용하면 된다.
      • qty 필드 값을 기준으로 오름차순 이므로 1을 넣어서 sort해준다.
  5. qty가 75보다 크거나 같고, 100보다 작은 document
    • 내 답 : db.inventory.find({$and:[{qty:{$gte:75}},{qty:{$lt:100}}]})
    • 풀이 :
      • 크거나 같은 경우는 이상을 뜻하는데 이 때는 $gte(greater than equal)를 사용하면 된다. 작은 것은 미만으로 $lt를 사용
      • ~이면서 ~한 것 처럼 조건이 걸려있므로 둘 다 만족해야 한다. 따라서 $and를 사용
  6. qty가 60이상이면서 size의 h가 10 이상인 document
    • 내 답 : db.inventory.find({$and:[{qty:{$gte:60}},{'size.h':{$gte:10}}]})
    • 풀이 :
      • 이상인 조건 두 가지를 동시에 충족시켜야하므로 $gte$and를 사용했다.
  7. uom이 in인 document
    • 내 답 : db.inventory.find({'size.uom':'in'})
    • 풀이 :
      • size 필드 안에 'h,w,uom'이 존재한다. 이것들에 접근하기 위해서는 'size.h', 'size.w' 이런 식으로 적어서 접근하면 된다. 위의 문제들 처럼 숫자 값이 아니라 문자 값이라는 걸 명시하면서 quotation('')를 적어주는 것도 신경써야한다.
  8. item이 p로 시작하는 document
    • 내 답 : db.inventory.find({item:{$regex:'^p'}})
    • 풀이 :
      • $regex를 사용해서 해당 필드가 특정한 문자를 포함하고 있는지 비교해서 값을 조회할 수 있다.
      • {$regex:'^문자'}는 해당 문자로 시작하는 값을 다 조회
      • {$regex:'문자$'}는 해당 문자로 끝나는 값을 다 조회
      • {$regex:'문자'} 는 시작과 끝에 관계 없이 해당 문자를 포함하고 있는 값을 다 조회
  9. item이 r로 끝나는 document
    • 내 답 : db.inventory.find({item:{$regex:'r$'}})
    • 풀이 :
      • 8번문제와 동일한 방법을 사용했다.
  10. item에 r이 들어간 document
    • 내 답 : db.inventory.find({item:/r/}), db.inventory.find({item:{$regex:'r'}})
    • 풀이 :
      • 8번 문제와 동일한 방법인 $regex를 사용
      • 추가로, $regex를 사용하지 않고 {필드:/문자/} 이런 식으로도 해당 문자를 포함한 값을 조회할 수 있다.
  11. qty의 값이 25나 45인 document
    • 내 답 : db.inventory.find({$or:[{qty:25},{qty:45}]})
    • 풀이 :
      • 25나 45, 둘 중 하나만 참이면 되므로 or 조건을 사용하면 된다. ($or)
  12. w의 값이 11나 21가 아닌 documnet
    • 내 답 : db.inventory.find({$nor:[{'size.w':11},{'size.w':21}]})
    • 풀이 :
      • 여기서는 11이나 21이 아닌이라는 조건이 있다. 둘 중 하나라도 포함하고 있으면 안되므로 nor 조건을 사용하면 된다. ($nor)
  13. $eq를 이용하여 item이 ‘notebook’인 document를 찾아, item과 status만 출력
    • 내 답 : db.inventory.find({item:{$eq:'notebook'}}, {_id:0,item:1,status:1})
    • 풀이 :
      • $eq:값 형태는 적어준 것과 같은 필드 내의 값을 조회한다. 하지만 그냥 {item:'notebook'} 이런 식으로 조회하는게 더 편할 것 같다.
  14. status가 A이거나 qty가 30미만 인 document
    • 내 답 : db.inventory.find({$or:[{status:'A'},{qty:{$lt:30}}]})
    • 풀이 :
      • $or 논리 연산자를 사용
  15. status가 A이고 qty가 30미만 인 document
    • 내 답 : db.inventory.find({$and:[{status:'A'},{qty:{$lt:30}}]})
    • 풀이 :
      • $and 논리 연산자를 사용
  16. h 기준으로 오름차순 정렬
    • 내 답 : db.inventory.find({},{}).sort({'size.h':1})
      • size필드 내의 h필드를 기준으로 잡기 위해서는 'size.h'로 지정해주자.
      • 오름차순이기 때문에 sort 값을 1로 지정
  17. h가 10보다 큰 document
    • 내 답 : db.inventory.find({'size.h':{$gt:10}})
    • 풀이 :
      • $gt 비교 연산자 사용
  18. qty가 100이 아닌 document 출력
    • 내 답 : db.inventory.find({qty:{$ne:100}})
    • 풀이 :
      • 같은 값을 찾을 때는 $eq를 사용한다면, 다른 값을 조회하고 싶다면 $ne (non equal)를 사용하면 된다.
  19. qty가 존재하면서, qty의 값이 50보다 큰 document
    • 내 답 : db.inventory.find({$and:[{qty:{$exists:1}}, {qty:{$gt:50}}]})
    • 풀이 :
      • 해당 필드가 존재하는지 알아보기 위해서는 $exists를 사용하자. 1은 True로 존재해야한다는 조건을 걸어준 것이다.
      • ~하면서 ~한 이런 조건은 둘 다 만족해야한다. 따라서, $and 사용
  20. uom이 cm인 document들의 item과 status만 출력
    • 내 답 : db.inventory.find({'size.uom':'cm'}, {_id:0, item:1, status:1})
    • 풀이 :
      • projection부분에서 item과 status 필드의 값을 1로 지정해준다.
      • 허나 저 둘만 지정해도 _id는 나오게 되어있다.(디폴트가 그러한 듯 하다.) 따라서, _id를 0으로 지정해주자.

2022

[web]jQuery 복습 3

1 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]jQuery 복습 2

13 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]jQuery 복습 1

14 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]JavaScript 정리4

5 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]JavaScript 정리3

10 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]JavaScript 정리2

7 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]JavaScript 정리1

8 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]CSS 기초 정리

11 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]HTML 기초 정리

8 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[Pandas]pandas 연습

3 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

맨 위로 이동 ↑

2021

[Python기초]module

1 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

맨 위로 이동 ↑