MongoDB TIL 05

Nabang Kim·2021년 9월 3일

MongoDB

목록 보기
5/10
post-thumbnail

2021년 9월 3일에 작성된 문서 5번 입니다.
MongoDB 배운 내용을 정리했습니다.



MongoDB CRUD - UPDATE

mongo shell에서 도큐먼트 업데이트 : updateOne, updateMany

  • updateOne : 도큐먼트 중 작업에 맞는 첫번째 도큐먼트 하나만 업데이트
  • updateMany : 쿼리문과 일치하는 모든 도큐먼트를 업데이트

미국의 우편번호 관련 데이터를 가지고 있는 zips라는 컬렉션에서 데이터를 가지고 왔습니다. 그리고 살펴보니 이 데이터에는 단순히 우편번호만 기재 되어 있는 것이 아니라, 우편 번호가 속한 도시이름, 주 이름 등이 기재되어 있고, 그 중에서도 pop 필드에 해당 지역의 인구수를 기록해두었습니다. 그러나 이 데이터들은 몇 년 전의 데이터라서 기록되어 있는 인구수와 현재의 인구수는 일치하지 않을 수도 있습니다.

  • 이 컬렉션의 대부분의 도시들 인구 수가 최소 10명정도 증가 했다고 가정
    • 다수의 데이터를 업데이트 해야하기 때문에 updateMany 가 적합



1. updateMany , $inc


1-1. {“city”:”ALPINE”} 에 있는 9개의 도큐먼트 pop필드인 인구수를 10명씩 늘려 한 번에 업데이트

  • ALPINE 시의 지역 인구 수 업데이트 : updateMany 사용
    • 첫번째 인자 : 어떤 도큐먼트를 업데이트 할지 결정하는 쿼리문
      • {“city”: “ALPINE”} : 해당 조건의 지역 인구수 데이터 업데이트
    • 두번째 인자 : 발생할 업데이트 내용을 특정.
      • MQL(MongoDB Query Language) 업데이트 연산자 : $inc
      • 특정 필드의 값을 원하는 만큼 증가.
        • {"$inc" : {"pop" :10}}와 같은 쿼리문을 작성.

  • 작업에 대한 응답 : matchedCount, modifiedCount
  • 해당 부분은 명령어에 들어가는 쿼리문 2개에 대한 응답
  • matchedCount
    • 첫번째 인자로 들어간 조건을 충족하는 도큐먼트 수 => 9
  • modifiedCount
    • 두 번째 인자로 들어간 업데이트 연산자 $inc로 수정된 도큐먼트의 수
  • matchedCountmodifiedCount가 동일한 값으로 출력
  • 실제로 도큐먼트의 pop필드가 성공적으로 업데이트




2. updateOne, $set

업데이트를 하기 위한 데이터로 zips 컬렉션의 zip 필드가 12534 값을 가지는 데이터 1개를 가져오겠습니다. 해당 데이터는 HUDSON이라는 미국의 한 도시입니다. 해당 도시의 현재 인구수를 검색해보았습니다. 그리고 데이터에는 21,205명이라고 기재되어 있지면 현재는 6,235명으로 인구 수가 감소한 것으로 확인되었습니다.


  • $set : 주어진 필드에 지정된 값을 업데이트
  • $set 연산자를 사용하여 바꾸고 싶은 값을 pop 필드에 작성.
    • 첫번째 인자 {“zips”: “12534”} 도큐먼트의 pop 필드가 $set 연산자를 사용해 지정한 값인 6235로 변경.


  • 인구수를 의미하는 필드 : pop

    그러나 만약 이 부분에서 population이라고 잘못 작성했다고 가정해보겠습니다. 보통 에러가 발생할 것이라고 예상하지만, 해당 도큐먼트 안에 잘못 작성된 필드가 추가되는 것을 볼 수 있습니다. MongoDB는 필드가 기존에 존재하지 않았음에도 업데이트 작업을 하였고, 곧 도큐먼트에 해당 필드를 추가하고 싶다는 사용자의 의지로 여겼습니다.

  • poppopulation 두 개의 필드가 도큐먼트 내에 존재

    • 그 둘은 같은 값을 가지고 있다.
    • $set 연산자도 다양한 필드에 값을 지정하기 위해서 사용할 수 있다.




3. $push

sample_training 데이터베이스에서 grades 컬렉션을 사용해보겠습니다.

  • $push : 배열로 이루어진 필드의 값에 요소를 추가하기 위한 연산자

3-1. scores에 extra credit을 추가하는 예시

  • extra credit : class_id가 339, student_id가 250인 학생에게 준다 가정.
    * 도큐먼트 조건: {“student_id” : 250, “class_id” : 339}

    {“type” : “extra credit”, “score” : 100} 형태의 서브 도큐먼트를 scores 필드의 값인 배열에 추가해야하므로 배열로 이루어진 필드의 값에 해당 서브 도큐먼트를 추가하기 위한 연산자인 $push를 써서 작성합니다.


3-2. 명령어에 대한 응답 결과

  • 첫번째 인자에 해당되는 도큐먼트가 1개 존재
  • 두번째 인자에서 준 형태로 업데이트한 도큐먼트가 1개 존재

확인하기 위해 해당 도큐먼트를 find로 찾는다.

  • scores 필드의 값인 배열 안에 서브 도큐먼트가 삽입됨.






Written with StackEdit

0개의 댓글