08-17 Query 작성하기

Ruinak·2021년 8월 17일
0

Bigdata Lesson

목록 보기
13/18
post-thumbnail

1. 쿼리구조

실습 준비

https://github.com/Karoid/mongodb_tutorials

  • 다운받아 nosqlboster에 import 함
  • area.json, # 전국 지역 정보와 인구수
  • by_month.json, # 각 지역 교통사고 통계 월별 정리
  • by_road_type.json, # 각 지역의 도로 형태별 사고 통계
  • by_type.json # 각 지역 사고 형태별 통계

값으로 쿼리하기

db.containerBox.find({name:'cat'})

연산자로 쿼리하기

{<filter> :{<operator> : <value>},....}
{height : {$gte: 175, $lte :180}
{height : {$gte: 175}, weight:{$lte :180}}
{$or [{ status : 'A'}, {qty:{$lt:30}}]}
{'name.first" : "Karoid", 'name.last': 'Jeong'}

2. 비교, 논리 연산자

비교 및 논리 연산자

db.inventory.insertMany([
  { item: "journal", qty: 25, tags: ["blank", "red"] },
  { item: "notebook", qty: 50, tags: ["red", "blank"] },
  { item: "paper", qty: 100, tags: ["black"] },
  { item: "planner", qty: 75, tags: ["blank", "red"] },
  { item: "postcard", qty: 45, tags: ["blue"] }
]);
db.inventory.find({item:{$eq:'journal'}})
db.inventory.find({item:'journal'})
db.inventory.find({tags: {$in : ['red']}})
db.inventory.find({tags: {$nin:["blank","blue"]}})
db.inventory.find({tags: {$in : [/^[a-z]*d/]}})
db.inventory.find({tags: {$in : [/^b/]}})
db.inventory.find({qty:{$not:{$gt:50}}})
db.inventory.find({qty:{$lte:50}})
db.inventory.find({$or:[{qty:{$gt:90}},{qty:{$lt:50}}]})
db.inventory.find({$and:[{qty:{$gt:50}},{qty:{$lt:90}}]})
db.inventory.find({qty:{$gt:50,$lt:90}})

3. 문자열 연산자

연산자

  • $regex 정규식
  • $text 문자열 검색

$regex 연산자

{<field> : { $regex : /pattern/, $options : '<options>'}}
{<field> : { $regex : 'pattern', $options : '<options>'}}
{<field> : { $regex : /pattern/<options>}}
db.article.find({"title": /article0[1-9]/i})
db.inventory.find({item:/^p/i}) #m 사용

$regex 연산자

  • i : 대소문자 무시
  • m: 대소문자 구분
  • x: 정규표현식에 있는 공백 모두 무시
  • s : 점(.)을 하용할 때 \n을 포함해서 매치

$text 연산자

{
  $text: {
    $search: <string>,
    $language: <string>,
    $caseSensitive: <boolean>,
    $diacriticSensitive: <boolean>
  }
}
  • $text Operation
db.stores.find( { $text: { $search: "java coffee shop" } } )
  • Exact Phrase : 정확하게 일치하는 문서 찾기
db.stores.find( { $text: { $search: "\"coffee shop\"" } } )
  • Term Exclustion : "-"연산자를 사용하여 검색에 제외할 텀을 지정
db.stores.find( { $text: { $search: "java shop -coffee" } } )
  • sort
db.stores.find(
... { $text: { $search: "java coffee shop" } },
... { score: { $meta: "textScore" } }
... ).sort( { score: { $meta: "textScore" } } )

4. 배열 연산자

배열 연산자 소개

  • $all 순서와 상관없이 있으면 선택
  • $elemMatch 조건과 맞는 배열 속 요소를 가진 것을 선택
  • $size 해당 배열의 크기와 같은 것 선택
item: "book", tags: ["blank", "red"]}
{item: "book", tags: ["red", "blank"]}
{item: "book", tags: ["blue"]}
  • tags에 red가 들어간 도큐먼트 전부 출력
db.inventory.find({tags: "red"})
  • tags가 "red", "blank" 둘 다 주어진 순서대로 가진 도큐먼트 전부 출력
db.inventory.find({tags: ["red", "blank"]})

$elemMatch

  • 배열의 요소 별로 해당 조건을 적용
db.collection.find({tags: {$gt: 10, $lt: 5}})
db.collection.find({tags: {$elemMatch: {$gt: 10, $lt: 5}}})
db.by_month.find({$and: [
  {month_data: {$elemMatch: {month: "01월", heavy_injury: 0}}},
  {month_data: {$elemMatch: {month: "02월", death_toll: 0}}}
]})

$all

  • 순서가 중요함
b.inventory.find({tags: ["red", "blank"]})
  • $all을 쓰면 "red", "blank" 순서와 상관 없이 해당 요소가 있는지만 확인
db.collection.find({tags: {$all: ["red", "blank"]}})

$size

  • 배열 lenth가 3인 문서
db.collection.find({tags: {$size: 3}})

5. 프로젝션 연산자

프로젝션 연산자의 역할

  • 특정 필드만 가져옴
  • $slice : 배열 필드에 주어진 범위
  • $elemMatch : 배열 필드의 조건에 맞는 것만
  • $ : 첫번째 요소만
db.people.insetMany(
  {name: {first: "철수", last: "김"}}
  {name: {first: "영희", last: "김"}}
  {name: {first: "수영", last: "박"}}
  {name: {first: "희영", last: "이"}}
)
db.collection.find({}, {"name.first": 1})

$slice

{item: "book", tags: ["red", "blank"]}
  • 잘못됨. tags의 첫번째 인자[0]가 아니라 tags 배열의 0이란 원소를 출력하라는 의미
db.collection.find({}, {"tags.0": 1})
  • tags 배열의 [0], [1]을 출력하라 (앞에서 부터 2개를 출력하라)
db.collection.find({}, {tags: {$slice: 2}})
  • tags 배열의 [2:3] 을 출력하라
db.collection.find({}, {tags: {$slice: [2, 3]}})

$elemMatch

-특정 조건에 부합하는 필드만 출력하라

db.collection.find({}, {$elemMatch: {$regex: /^b/}})

$ 연산자

  • 특정 조건에 부합하는 첫번째 데이터만 출력하라
db.collection.find({{tags: “red”}, {“tags.$:true}})

실습

전국의 ‘차대차‘ 사고에서 100회 이상 사고가 났지만 사망자 수가 0회인 지역

db.by_type.find({
	type: "차대차",
	accident_count: {
		$gte: 100
	},
	death_toll: 0
})

전국의 ‘차대사람’ 사고 중에서 사망자수가 0회이거나 중상자수가 0회인 지역

db.by_type.find({
    $or: [{
        type: "차대사람"
    }, {
        heavy_injury: {
            $gte: 0
        }
    }, {
        death_toll: 0
    }]
})

과제

  1. 전국 도루 종류 중에 '기타단일로'로 중에 사망자가 0인 도큐먼트의 지역명과 '기타단일로의 사망자수, _id 출력
  • 2차 지역명이 구로 끝나는 도큐먼트를 찾아라
  • 동시에 2차 지영명 첫글자 초성이 'o'인 도큐먼트를 찾아라
  • 탖은 도큐먼트에서 1,2차 지역명과 매월 사고 회수가 150회 이상인 달의 month 필드를 출력하라.
  • 서울시에서 한달이 200회 이상 사고가 일어난 적이 있는 도큐먼트를 출력하라.
  • 단 200회 이상 사고가 난 달의 정보가 도큐먼트에 한달치만 추력되어야 한다.
  • 또한 'month_data"필드의 2차 지역명 관련 필드, _id만 표시된다.
profile
Nil Desperandum <절대 절망하지 마라>

0개의 댓글