[MongoDB] MongoDB 쿼리(Query)

1 minute read

3. 쿼리 작성하기

실습 DB 구축

실습을 위해 JSON or XML 형식의 파일을 MongoDB에 입력

1. 복사할 DB 경로 진입
2. mongoimport -d [DB명] -c [컬렉션명] --file [파일명]

해당 파일의 데이터를 입력한 DB, 컬렉션의 도큐먼트로 저장


실습 DB 소개


3.1 쿼리의 구조

db.collection.find(query, projection)

  • 값으로 쿼리
    • db.area.find({city_or_province:"서울"}).pretty()
  • 연산자 사용(https://docs.mongodb.com/manual/reference/operator/query/)
    • 서울시 중 300,000 이상의 인구수를 가진 구
      • db.area.find({population: {$gte:300000}, city_or_province:"서울"}).pretty()
    • 1월의 사망자수가 0이면서 사고율이 100 미만인 지역
      • db.by_month.find({"month_data.0.death_toll":0, "month_data.0.accident_count": {$lte: 100}}).pretty()
  • 실습
    • 강릉시 교차로 내에서 일어난 총 사고 숫자
      • db.by_road_type.find({county:"강릉시"}, {"교차로내.accident_count": 1}).pretty()
    • 도로 종류 중에 기타단일로에서 사망자수가 0인 지역
      • db.by_road_type.find({"기타단일로.death_toll":0}, {city_or_province:1, county:1}).pretty()


3.2 논리, 비교 연산자

  • $not, $or, $and, $nor
  • 실습
    • 차대차 사고에서 100회 이상 사고가 났지만, 사망자 수가 0회인 지역
      • db.by_type.find({type:"차대차", accident_count: {$gte : 100}, death_toll: 0}, {city_or_province:1, county:1}).pretty()
    • 차대사람 사고 중 사망자수가 0회이거나 중상자수가 0회인 지역
      • db.by_type.find({type:"차대사람", $or:[{death_toll:0},{heavy_injury:0}]}, {city_or_province:1, county:1}).pretty()

3.3 문자열 연산자

  • $regex

    정규 표현식과 맞는 도큐먼트 선택

    • 연산자 없이 사용(자주 사용됨)

      { [필드명]: /[정규식]/[옵션] } }

    • 연산자 사용(한 필드에 여러 연산자를 적용하려고 할 때 사용)

      e.g. { [필드명]: { $regex: /article0[1-9]/i, $not: /article03/ } }

    https://docs.mongodb.com/manual/reference/operator/query/regex/

  • $text 연산자

    문자열 검색

    { $text: { $search: [값], [기타 옵션]:[값], ... } }

    • $search : 검색하려는 내용, 띄어쓰기 포함
    • 기타 옵션 : 사용하는 언어 설정, 대소문자 구분 여부, 첨자 기호 허용 여부

    $text 연산자를 사용하기 위해서는 문자열 인덱스를 먼저 만들어야 함

    • 문자열 인덱스 생성
      • db.[컬렉션명].createIndex( { [필드명] : "text", [필드명]: "text", ... } )
  • 실습

    • 2차 지역명이 시라는 이름으로 끝나는 지역의 수
      • ` db.area.find({county: /시$/}).count()`
    • 2차 지역명이 군이면서 인구수가 10만 이상인 곳
      • db.area.find({county:/군$/, population : {$gte: 100000}}).count()
    • 2차 지역명이 구로 끝나면서, 이름의 첫 글자의 초성이 “ㅇ”인 2차 지역명
      • db.area.find({county: {$regex: /구$/, $gte: "아", $lt: "자"}}, {county:1})

Categories:

Updated:

Leave a comment