ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 쿼리 작성 실습
    데이터베이스/MongoDB 2023. 12. 28. 13:50
    실습 예제 준비

     

    1. 사이트에서 다운받기

    https://github.com/Karoid/mongodb_tutorials

     

    GitHub - Karoid/mongodb_tutorials: 몽고디비 실습을 위한 자료

    몽고디비 실습을 위한 자료. Contribute to Karoid/mongodb_tutorials development by creating an account on GitHub.

    github.com

     

    2. cmd 창에서 입력 (git이 다운로드되어 있어야 함)

    > git clone https://github.com/Karoid/mongodb_tutorials.git
    > cd mongodb_tutorials
    > cd car_accident
    > mongoimport -d car_accident -c area --file area.json
    > mongoimport -d car_accident -c by_month --file by_month.json
    > mongoimport -d car_accident -c by_road_type --file by_road_type.json
    > mongoimport -d car_accident -c by_type --file by_type.json

    compass 켜보면 입력되어 있는 것 확인

     

    실습 - 연산자

     

    use car_accident

     

    1. 강릉시(county 값) 교차로 내에서 일어난 총 사고 숫자 출력(프로젝션 이용)

    db.by_road_type.find({county: '강릉시'}, {'교차로내.accident_count': 1})
    
    {
      _id: ObjectId("5c890bb20da47a8507758acd"),
      '교차로내': {
        accident_count: 375
      }
    }

     

    2. 전국에서 도로 종류 중에 '기타단일로'에서 사망자수가 0인 지역 출력

    db.by_road_type.find({'기타단일로.death_toll': 0}, {city_or_province: 1, county: 1})
    
    {
      _id: ObjectId("5c890bb20da47a85077588ff"),
      city_or_province: '경기',
      county: '구리시'
    }
    {
      _id: ObjectId("5c890bb20da47a8507758d4b"),
      city_or_province: '충남',
      county: '계룡시'
    }

     

    실습 - 논리, 비교 연산자

     

    1. 전국의 '차대차' 사고에서 100회 이상 사고가 났지만 사망자 수가 0회인 지역 출력

    db.by_type.find({type: '차대차', accident_count: {$gte: 100}, death_toll: 0}, {city_or_province: 1, county: 1})

     

    2. 전국의 '차대사람' 사고 중에서 사망자 수가 0회이거나 중상자 수가 0회인 지역 출력

    db.by_type.find({type: '차대사람', $or:[{death_toll: 0}, {heavy_injury: 0}]}, {city_or_province: 1, county: 1})

     

    실습 - 문자열 연산자

     

    1. 2차 지역명(county)이 '시'라는 이름으로 끝나는 지역의 수 세어보기

    db.area.find({county: /시$/}).count()
    
    77

     

    2. 2차 지역명(county)이 '군'이면서 인구수가 10만 이상인 곳 출력

    db.area.find({county: /군$/, population: {$gte: 100000} }).count()
    
    5

     

    3. 2차 지역명(county)이 '구'로 끝나면서, 이름의 첫 글자의 초성이 'ㅇ'인 2차 지역명 출력

    db.area.find({county: {$regex: /구$/, $gte: '아', $lt: '자'} }, {county: 1})

     

    실습 - 배열 연산자

     

    1. 서울시에서 한 달에 200회 이상 교통사고가 일어난 적이 있는 지역 출력

    db.by_month.find({ city_or_province: '서울', 'month_data.accident_count': {$gte: 200} }, {county: 1})

     

    2. 1월에 중상자 수가 0명이고, 2월에 사망자 수가 0명인 지역 출력

    db.by_month.find({
        $and: [
          { month_data: { $elemMatch: {month: '01월', heavy_injury: 0} } },
          { month_data: { $elemMatch: {month: '02월', death_toll: 0} } }
    		  ]
    		}, {city_or_province: 1, county: 1})

     

    실습 - 프로젝션 연산자

     

    1. 전국에서 도로 종류 중에 '기타단일로'에서 사망자 수가 0인 도큐먼트 출력

    단, 해당 지역의 지역명과 관련된 필드와 '기타단일로'의 사망자 수, 필드, _id 필드만 출력

    db.by_road_type.find({'기타단일로.death_toll': 0}, {city_or_province: 1, county: 1, '기타단일로.death_toll': 1})

     

    2. 다음 조건을 만족하게 출력

    A. 2차 지역명(county)이 구로 끝나는 도큐먼트 찾기

    B. 동시에 county 첫 글자 초성이 'ㅇ'인 도큐먼트 찾기

    C. 찾은 도큐먼트에서 1, 2차 지역명과 id필드, 매월 사고 횟수가 150회 이상인 달(month 필드)의 이름 출력

    db.by_month.find(
      {$and: [{ county: {$regex: /구$/, $gte: '아', $lt: '자'} },
              { month_data: {$elemMatch: {accident_count: {$gte: 150}}} }]},
      {city_or_province: 1, county: 1, 'month_data.month.$': 1 }
    )

    위처럼 하면 안 됨... 2차 지역명이 '구'로 끝나는 동시에 첫 글자 초성 'ㅇ'를 만족한 결과들 중에서 지역명, id, 매월 사고 횟수가 150회 이상인 달의 필드 이름 출력

     

     

    3. 다음 조건을 만족하게 출력

    A. 서울시에서 한 달에 200회 이상 사고가 일어난 적 있는 도큐먼트 출력

    B. 단, 200회 이상 사고가 난 달의 정보가 도큐먼트에 한 달치만 출력

    C. 또한 'month_data' 필드와 2차 지역명 관련 필드, _id 필드만 도큐먼트에 표시

    db.by_month.find({city_or_province: '서울', 'month_data.accident_count': {$gte: 200}}, {'month_data.$': 1, county: 1})

    '데이터베이스 > MongoDB' 카테고리의 다른 글

    프로젝션 연산자  (0) 2023.12.29
    배열 연산자  (0) 2023.12.28
    문자열 연산자  (0) 2023.12.28
    배열 연습 문제  (0) 2023.12.15
    MongoDB 문제 예제 2  (0) 2023.12.14
Designed by Tistory.