MongoDB 사용법

EBinY·2021년 12월 24일
0
post-thumbnail

Import & Exporting

  • 데이터를 가져오거나 내보내는 경우에 따라 효율적인 데이터 형식이 존재함
  • MongoDB는 BSON의 형태로 저장, 보통 읽기 쉬운 JSON 형태로 출력함
    • 조건에 따라, 가져오거나 내보낼 때 사용 가능한 명령어가 각각 존재
  • JSON: mongoimport, mongoexport
  • BSON: mongorestore, mongodump
  • EXPORT
  • Import
    • 기존 데이터를 삭제하기 위한 drop query는 선택적으로 사용

MongoDB CRUD

  • CREATE
    • 도큐먼트 고유한 값인 "_id" 와 새로운 도큐먼트를 추가하는 방법
    • show collections
    • db.컬렉션이름.insert()
    • db.컬렉션이름.find()
    • 모든 도큐먼트는 _id 필드를 기본값으로 반드시 가져야 함
    • 내부 필드값이 같아도, _id가 다르면 다른 도큐먼트로 취급함
    • 임의적으로 생성해서 사용할 수도 있지만, 보통 ObjectId 타입의 값으로 사용함
    • 도큐먼트 추가 시, _id필드와 값을 특정하지 않으면 자동적으로 생성됨
    • 다량의 도큐먼트를 추가할 때, 중간 부분에서 에러가 발생하면, 에러 이후로 있는 부분은 실행이 되지 않는다
      • 이를 방지하기 위해, 데이터를 넣은 인자 뒤에 {"ordered":false}를 추가해주면 에러 부분만 걸러내고 뒤 부분의 데이터도 잘 삽입됨
    • 삽입 시에 없는 컬렉션 명을 넣을 경우, 컬렉션이 새로 생성된다
  • READ
    • show dbs
    • use 데이터베이스이름
    • db.컬렉션이름.find({query1}, {query2}): 조건을 추가할 수 있고, 생략시 전체 데이터를 조회한다
    • db.컬렉션이름.find().count(): 검색한 데이터의 수만 카운트해서 출력한다
    • db.컬렉션이름.find().pretty(): 검색한 데이터를 가독성 좋게 정리해서 출력한다
    • cursor.pretty() - cursor는 find 메소드를 실행해서 얻어낸 결과의 집합
    • db.컬렉션이름.findOne({query}): 조건에 맞는 1개의 데이터만 출력, 생략할 경우 무작위의 1개 데이터를 출력한다
    • 조회된 결과물이 많을 경우, 20개 단위로 화면에 출력, it를 입력하여 다음 페이지를 조회
  • UPDATE
    • db.컬렉션이름.updateOne({query}): 조건과 일치하는 첫번째 도큐먼트만 업데이트
    • db.컬렉션이름.updateMany({query}): 조건에 맞는 모든 도큐먼트 업데이트
    • 연산자(MQL)
      • inc: 특정 필드 값을 증가, {"inc":{"pop":10}}
      • set: 특정 필드 값을 수정, {"set":{"pop":1100}}
        • 없는 필드 값을 지정하는 경우, 필드를 생성하여 값을 넣는다
      • $push: 배열로 이루어진 필드 값에 요소를 추가한다, 필드가 없으면 필드를 생성하고 값에 빈 배열을 생성하고 요소를 추가한다
  • DELETE
    • db.컬렉션이름.deleteOne({query}): 조건과 일치하는 첫번째 도큐먼트만 삭제
    • db.컬렉션이름.deleteMany({query}): 조건과 일치하는 모든 도큐먼트 삭제
    • db.컬렉션이름.drop(): 컬렉션 전체 삭제

Advanced CRUD

  • 비교 연산자: { field : { operator : value } }

    • 연산자가 지정되지 않은 경우, 기본 연산자로 $eq이 사용됨
    • $eq: =, equal to, 같은지
    • $gt: >, greater than, 큰지
    • $gte: >=, greater than or equal to, 크거나 같은지
    • $ne: !=, not equal, 같지 않은지
    • $lt: <, less than, 작은지
    • $lte: <=, less than or equal to, 작거나 같은지
    • (ex) db.run.find({"time":{"$lte":70}})
  • 논리 연산자: {:[{statement1},{statement2},...]}

    • 연산자가 지정되지 않은 경우, 기본 연산자로 $and가 사용됨
    • $and: 모든 쿼리와 일치하는지,
    • $or: 쿼리 중 하나라도 일치하는지,
    • $nor: 모든 쿼리와 일치하지 않는지,
    • $ not : 주어진 쿼리와 일치하지 않는지, {$not:{statement}}

  • 표현 연산자

    • expr: 집계 표현식을 사용, {expr:{}}
    • 비교 연산자를 같이 사용할 때: {:{,}}
    • (ex): {"expr" :{"eq":["startstationid","start station id","end station id"]}}
    • 해당 값이 어떤 필드와 같아야 하는지 지정하지 않고도 자체적으로 동일한 도큐먼트 내에서 start station id 값과 end station id 값을 직접 비교
    • "$start sta id"의 $: 필드의 값을 참조하기 위해 붙여줌, id의 값을 참조함
  • 배열 연산자

    • $push: 배열의 마지막 위치에 추가, 배열이 아닌 필드에 사용할 경우, 필드의 타입을 배열로 바꿈
    • $all
    • $size
  • 배열 연산자와 Projection

    • find 쿼리의 첫 번째 인자에는 찾으려는 도큐먼트의 조건, 두 번째 인자가 찾고 있는 필드를 설명하는 projection
    • $elemMatch(projection)
    • $elemMatch(query)


  • 배열과 서브 도큐먼트 쿼리하기

    • MongoDB에서는 유연한 데이터 모델링을 통해 개발자가 데이터를 저장할 방법을 결정
    • MongoDB에서는 일반적으로 서브 도큐먼트 또는 배열로 저장
    • MQL에서 점 표기법(Dot notation)을 사용, 서브 도큐먼트의 요소를 참조
    • 배열에서 Dot notation을 사용하려면, 요소의 위치를 지정해야 함
    • db..find({"field1.field2.field3":"value"})
    • db.companies.find({"relationships.0.person.last_name": "Zuckerberg"}, {"name": 1}) => {"_id":1234, "name":"Facebook"}
      • 0: 배열의 첫번째 요소의 위치
      • person: 중첩된 객체를 값으로 가지고 있는 필드
      • last_name: 서브 도큐먼트 person의 필드
      • "Zuckerberg": 우리가 찾고 있는 값
      • {"name":1}: 결과에 name 필드만 포함하도록 Projection
      • Zuckerberg를 last_name으로 갖는 회사의 name이 출력됨
    • $regex

0개의 댓글

관련 채용 정보