-
쿼리 작성 실습데이터베이스/MongoDB 2023. 12. 28. 13:50
실습 예제 준비
1. 사이트에서 다운받기
https://github.com/Karoid/mongodb_tutorials
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
실습 - 연산자
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})