쿼리 작성 실습
실습 예제 준비
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
실습 - 연산자
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})